Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.6K
Vistas
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 dado.

 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 Respuestas
Responde la pregunta

0

Recupera ofertas 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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda