Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

342
Views
Ya se está rastreando otra instancia con el valor clave '' en una relación 1:n

Estoy tratando de actualizar una entidad Tender , esta entidad tiene una Lista de TenderOffer y esta TenderOffer tiene una entidad Company . Cuando intento actualizar el Tender me sale el siguiente error

Message=La instancia del tipo de entidad 'Compañía' no se puede rastrear porque ya se está rastreando otra instancia con el valor clave '{ID: 4}'. Al adjuntar entidades existentes, asegúrese de que solo se adjunte una instancia de entidad con un valor de clave determinado.

 Source=Microsoft.EntityFrameworkCore StackTrace: at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.ThrowIdentityConflict(InternalEntityEntryentry) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.Add(TKeykey, InternalEntityEntry entry, Boolean updateDuplicate) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.Add(TKeykey, InternalEntityEntry entry) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.Add(InternalEntityEntryentry) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntryentry) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityStateoldState, EntityState newState, Boolean acceptChanges, BooleanmodifyProperties) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityStateentityState, Boolean acceptChanges, Boolean modifyProperties,Nullable`1 forceStateWhenUnknownKey) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode`1node) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode`1node, Func`2 handleNode) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode`1node, Func`2 handleNode) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode`1node, Func`2 handleNode) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode`1node, Func`2 handleNode) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.AttachGraph(InternalEntityEntryrootEntry, EntityState targetState, EntityStatestoreGeneratedWithKeySetTargetState, Boolean forceStateWhenUnknownKey) at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.SetEntityState(InternalEntityEntryentry, EntityState entityState) at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.Update(TEntity entity) at DAL.Repositories.TendersRepository.<UpdateTender>d__10.MoveNext() in C:\Progetti\DAL\Repositories\TendersRepository.cs:line 613 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at UI.Controllers.TenderController.<SelectTenderWinner>d__13.MoveNext() in C:\Progetti\UI\Controllers\TenderController.cs:line 808 This exception was originally thrown at this call stack: [External Code] DAL.Repositories.TendersRepository.UpdateTender(ML.Models.Tender) in TendersRepository.cs [External Code] UI.Controllers.TenderController.SelectTenderWinner(int,int, bool) in TenderController.cs

No entiendo por qué recibo este error de seguimiento. He deshabilitado todo el comportamiento de seguimiento del constructor del DBContext

 base.ChangeTracker.AutoDetectChangesEnabled = false; base.ChangeTracker.LazyLoadingEnabled = false; base.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

También estoy usando AsNoTracking() en todas mis consultas. No puedo entender por qué EF core está rastreando de todos modos.

La entidad_uno es "Tender", la entidad_dos es "TenderOffer"

Este es el código en el controlador:

 try { //id and winnerOfferID are parameters of the request Tender tender = await this._tenderRepository.GetTender(id, false, this.CurrentCompanyID); TenderOffer offer = tender.TenderOffers.FirstOrDefault(o => o.ID == winnerOfferID) tender.IsClosed = true; tender.ClosureDate = DateTime.UtcNow; tender.ShowWinner = showWinner; tender.WinnerOfferID = winnerOfferID; tender.TenderOffers.ForEach(o => { if (o.ID == winnerOfferID) { o.Status = TenderOfferStatus.Winner; } else { o.Status = TenderOfferStatus.Rejected; o.Company = null; } }); await this._tenderRepository.UpdateTender(tender); return Ok(); } catch (Exception ex) { return StatusCode(500); }

Esta es la función Actualizar:

 public async Task<Tender> UpdateTender(Tender tender) { if (tender == null || tender.ID <= 0) throw new ArgumentNullException("Cannot update, tender is null"); this._context.Tenders.Update(tender); await this.SaveChangesAsync(); return tender; }

Esta es la función Obtener:

 public async Task<Tender> GetTender(int id, bool skipCompanyCheck = false, int? companyId = null) { IQueryable<Tender> query = this._context.Tenders.AsNoTracking() .Include(t => t.Company).AsNoTracking() .Include(t => t.Company).ThenInclude(c => c.Logo).AsNoTracking(); //Other include based on parameters, ALSO TENDER OFFERS tender = await query.Where(tender => tender.ID == id).FirstOrDefaultAsync(); return tender; }
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Recupera licitaciones sin seguimiento, pero las opciones de ChangeTracker no significan que EF ya no sea capaz de cambiar el seguimiento. De hecho, cuenta con que pueda realizar un seguimiento de los cambios, ver las modificaciones posteriores y la llamada SaveChanges .

La sentencia this._context.Tenders.Update(tender); marca todos los objetos en el gráfico de objetos (es decir, objetos secundarios tender y adheridos) como Modified . El problema es que el gráfico contiene varias instancias de la misma Company , porque varias TenderOffer se refieren a la misma empresa.

Esto provoca la excepción "ya se está rastreando otra instancia con el valor clave '{ID: 4}'".

Parece justo suponer que EF debería saber que es el mismo objeto, pero no es así. Eso tiene que ver con el comportamiento de AsNoTracking . Desde EFC 3.0, AsNoTracking no tiene resolución de identidad , lo que significa que cuando una entidad aparece varias veces en el resultado de una consulta, se materializan varias instancias de la misma. Para cambiar este comportamiento, debe usar AsNoTrackingWithIdentityResolution() . (Solo una llamada en una instrucción LINQ es suficiente).

Por cierto, si no incluye Company y agrega una propiedad CompanyId anulable a TenderOffer , simplemente puede establecer esa propiedad en null . La declaración de Update actual también marca Company como Modified , lo cual no es necesario. Eso podría evitarse adjuntando primero las instancias de Company al contexto, pero establecer un CompanyId es más fácil y liviano.

Otra alternativa sería obtener los datos con seguimiento, modificar sus propiedades y guardar los cambios sin llamar a Update .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!