EF5-6.1.1中的NullReferenceException有两个相同类型的导航属性我想先说说我有一个解决方法——但我今天花了几个小时找出异常的原因,所以我想我会在给定的域中共享两个实体:publicclassUser{publicintId{get;放;}}}publicclassTicket{publicintId{get;放;}公共字符串名称{得到;放;}publicvirtualUserOwner{get;放;公共诠释?LockedByUserId{得到;放;}publicvirtualUserLockedByUser{get;放;}1541648976publicbyte[]ETag{get;放;}}以下配置:publicclassTicketConfiguration:EntityTypeConfiguration{publicTicketConfiguration(){HasRequired(x=>x.Owner);(x=>x.LockedByUser).WithMany().HasForeignKey(x=>x.LockedByUserId);属性(x=>x.ETag).IsConcurrencyToken(真);}}这个种子:protectedoverridevoidSeed(DataContextcontext){varusers=context.Set();varuser=newUser{Name="Foo"};users.AddOrUpdate(x=>x.Name,用户);user=users.SingleOrDefault(x=>x.Name=="Foo")??用户;vartickets=context.Set();tickets.AddOrUpdate(x=>x.Name,newTicket{Name="Bar",Owner=user,});}我得到了一个例子:staticvoidMain(){varconfig=newMigrations.Configuration{CommandTimeout=3600};varmigrator=newDbMigrator(配置);迁移器.Update();using(vartransaction=GetTransaction())//我试过使用和不使用transaction{varcontext=newDataContext();varuserId=context.Set().Where(x=>x.Name=="Foo").Select(x=>x.Id).Single();varticket=context.Set().Single(x=>x.Name=="Bar");ticket.LockedByUserId=userId;context.SaveChanges();//此处抛出异常'System.NullReferenceException'//在System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.GetOtherEndOfRelationship(IEntityWrapperwrappedEntity)//在System.Data.Entity.Core.Objects.EntityEntry.AddRelationshipDetectedByForeignKey(Dictionary)`2关系,字典`2principalRelationships,EntityKeyrelatedKey,EntityEntryrelatedEntry,RelatedEndrelatedEndFrom)//在System.Data.Entity.Core.Objects.EntityEntry.DetectChangesInForeignKeys()//在System.Data.Entity.Core.Objects.ObjectStateManager.DetectChangesInForeignKeys(IList`1条目)//在System.Data.Entity.Core.Objects.ObjectStateManager.DetectChanges()//在System.Data.Entity.Core.Objects.ObjectContext.DetectChanges()//在System.Data.Entity.Internal.InternalContext。DetectChanges(布尔力)//在System.Data.Entity.Internal.InternalContext.GetStateEntries(Func`2谓词)//在System.Data.Entity.Internal.InternalContext.GetStateEntries()//在System.Data.Entity。Infrastructure.DbChangeTracker.Entries()//在System.Data.Entity.DbContext.GetValidationErrors()//在System.Data.Entity.Internal.InternalContext.SaveChanges()//在System.Data.Entity.Internal.LazyInternalContext。SaveChanges()//在System.Data.Entity.DbContext.SaveChanges()//在EntityFrameworkFkNull.Program.Main(String[]args)在h:ProjectsSpikesEntityFrameworkFkNullEntityFrameworkFkNullProgram.cs:line27//atSystem.AppDomain._nExecuteAssembly(RuntimeAssemblyassembly,String[]args)//atSystem.AppDomain.ExecuteAssembly(StringassemblyFile,EvidenceassemblySecurity,String[]args)//在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()//在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)//在System.Threading.ExecutionContext.RunInternal(ExecutionContextexecutionContext,ContextCallbackcallback,Objectstate,BooleanpreserveSyncCtx)//atSystem.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallbackcallback,Objectstate,BooleanpreserveSyncCtx)//atSystem.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallback回调,对象状态)//在System.Threading.ThreadHelper.ThreadStart()transaction.Complete();}}获取完整的解决方案,在这里试试自己:https://github.com/mvidacovich/EntityFrameworkFkNull我相信这是因为Ticket有两个不同的外键用户,但只有其中一个是明确配置的。就我自己的测试而言,这会影响EF5到Ef6。所以,这引出了一个问题:EF会在那里抛出异常吗?解决方案是在Ticket上设置一个“OwnerId”属性。(参见github中解决方案中的fix分支)所以,Ticket变为:publicclassTicket{publicintId{get;放;}公共字符串名称{得到;放;公共诠释?OwnerId{得到;放;}公共}公共int?LockedByUserId{得到;放;}publicvirtualUserLockedByUser{get;放;}1541648976publicbyte[]ETag{get;放;}}Ticket的配置修改为:Property(x=>x.OwnerId).HasColumnName("Owner_Id");HasOptional(x=>x.LockedByUser).WithMany().HasForeignKey(x=>x.LockedByUserId);属性(x=>x.ETag).IsConcurrencyToken(真);现在注意明确的OwnerId。查看完整(固定)解决方案:https://github.com/mvidacovich/EntityFrameworkFkNull/tree/Fix以上都是C#学习教程:EF5-6.1.1中的NullReferenceException,两个相同类型的导航属性共享所有内容如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
