簡體   English   中英

使用EF 6克隆實體,空引用異常

[英]Cloning entity with EF 6, null reference exception

我試圖克隆一個實體(EF 6.x,代碼優先),使用這里的技術: 實體框架5深度復制/克隆實體

但是,在嘗試將克隆的票證添加到DbSet時,我收到一個奇怪的NullReference異常:

var clonedTicket = _context.Tickets
          .AsNoTracking()
          .Include(o => o.Lines.Select(l => l.Serials))
          .Include(o => o.Payments.Select(p => p.PayCodeInfo))
          .SingleOrDefault(o => o.TicketId == ticketId);

clonedTicket.TicketId = _context.Tickets.Max(o => o.TicketId) + 1;

foreach (var line in clonedTicket.Lines)
    line.TicketId = clonedTicket.TicketId;

foreach (var payment in clonedTicket.Payments)
    payment.TicketId = clonedTicket.TicketId;

  _context.Tickets.Add(clonedTicket);  <---- System.NullReferenceException
  _context.SaveChanges();

例外是_context.Tickets.Add(clonedTicket)。

clonedTicket看起來很正常,沒有什么是null,不應該是。 當然,_context和Tickets(DbSet)都是非null。

以下是完整的例外情況:

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=EntityFramework
  StackTrace:
       at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.MarkForeignKeyPropertiesModified()
       at System.Data.Entity.Core.Objects.DataClasses.EntityReference.AddToNavigationPropertyIfCompatible(RelatedEnd otherRelatedEnd)
       at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
       at System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
       at System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach)
       at System.Data.Entity.Core.Objects.ObjectContext.AddObject(String entitySetName, Object entity)
       at System.Data.Entity.Internal.Linq.InternalSet`1.<>c__DisplayClassd.<Add>b__c()
       at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
       at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
       at System.Data.Entity.DbSet`1.Add(TEntity entity)
       at TheRepo.CreateCloneFromTicket(Int32 ticketId, String clientIp) in c:\...\TheRepo.cs:line 23
       at TheController.CreateReturn(Int32 ticketId) in c:\...\TheController.cs:line 232
       at lambda_method(Closure , Object , Object[] )
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
  InnerException: 

我在這里錯過了什么?

我得到了這個工作。 訣竅是在檢索實體之前設置ProxyCreationEnabled = false:

_context.Configuration.ProxyCreationEnabled = false;
var returnTicket = _context.Tickets
   .AsNoTracking()
   .Include(o => o.Lines.Select(l => l.Serials))
   .Include(o => o.Payments)
   .SingleOrDefault(o => o.TicketId == ticketId);
_context.Configuration.ProxyCreationEnabled = true;

我不能說我完全理解為什么會這樣,但我想這與EF在啟用ProxyCreation時所做的延遲加載有關(我不需要/想要這里,因為我明確地加載了相關的實體)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM