Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

346
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda