当前位置: 首页 > 编程语言 > C#

EF:在DbContext共享上禁用“AutoDetectChangesEnabled”和“ProxyCreationEnabled”时从多对多关系中创建-删除关系

时间:2023-04-10 22:54:18 C#

EF:在DbContext多关系创建/上禁用“AutoDetectChangesEnabled”和“ProxyCreationEnabled”删除关系了解Foo.Id和Bar.Id如何在不加载数据库实体的情况下创建关系。classFoo{publicintId{get;放;}publicLstBars{get;放;}}classBar{publicintId{get;放;}publicLstFoos{get;放;这个配置也是在DbContext中构造的Disabled函数:Configuration.AutoDetectChangesEnabled=false;Configuration.ProxyCreationEnabled=false;Configuration.LazyLoadingEnabled=false;以及如何消除这种关系?示例:使用(varctx=newDbCtx()){ctx.Configuration.LazyLoadingEnabled=false;ctx.Configuration.ProxyCreationEnabled=false;ctx.Configuration.AutoDetectChangesEnabled=false;ctx.Database.Log+=Console.WriteLine;varfoo=newFoo{Id=1,Bars=newList()};varbar=newBar{Id=3,Foos=newList()};//这种方法行不通,因为AutoDetectChanges被禁用ctx.Foos.Attach(foo);ctx.Bars.Attach(bar);foo.Bars.Add(bar);ctx.SaveChanges();我如何在不更改配置的情况下定义这里的关系。先感谢您。好的,找到解决方案,这是辅助方法:staticvoidChangeRelationship(IObjectContextAdapterctx,T1a,T2b,Expression>getNavigationProperty,EntityStatestate)whereT1:class{ctx.ObjectContext.ObjectStateManager.ChangeRelationshipState(a,b,getNavigationProperty,状态);}并在问题示例中使用它:using(varctx=newDbCtx()){ctx.Configuration.LazyLoadingEnabled=false;ctx.Configuration.ProxyCreationEnabled=false;ctx.Configuration.AutoDetectChangesEnabled=false;ctx.Database.Log+=Console.WriteLine;varfoo=newFoo{Id=1,Bars=newList()};varbar=newBar{Id=3,Foos=newList()};ctx.Entry(foo).State=EntityState.Unchanged;ctx.Entry(bar).State=EntityState.Unchanged;//创建ChangeRelationship(ctx,foo,bar,x=>x.Bars,EntityState.Added);CTX。保存更改();//移除ChangeRelationship(ctx,foo,bar,x=>x.Bars,EntityState.Deleted);ctx.SaveChanges();如果我理解正确,您想将Bar对象添加到现有的Foo实体而不查找Foo实体。假设您有Foo(id=1)已经存在。想要添加新的Bar(id=100)实体。使用(varcontext=newContext()){varbar=newBar(){Id=100};varfoo=newFoo(){Id=1};//只有ID是必需的上下文。嘘。附加(富);bar.Foos.Add(foo);context.Bars.Add(bar);context.SaveChanges();你问的是可能的。以下是步骤:(1)首先创建两个仅指定PK的实体实例,并将其中一个(比如foo)附加到上下文:varfoo=newFoo{Id=fooId};varbar=newBar{Id=barId};ctx.Foos.Attach(foo);(2)将第二个实体集合设置为包含第一个实体的新列表(即“创建”关系):bar.Foos=newList{foo};(3)标记第二个实体如下:(A)添加关系:ctx.Entry(bar).State=EntityState.Added;(B)删除关系:ctx.Entry(bar).State=EntityState.Deleted;(4)将第二个实体标记为未更改:ctx.Entry(bar).State=EntityState.Unchanged;就是这样!一旦您调用ctx.SaveChanges();,关系将被添加到连接表或从连接表中删除。更新:虽然上面的方法有效(实际上我的原始解决方案将第二个实体附加到“原始”集合然后模拟修改也有效,如果我们在最后明确调用DbContext.ChangeTracker.DetectChanges()),我应该认识到ObjectContext的您找到的解决方案似乎更自然(奇怪的是,此功能尚未通过DbContext),因此我个人的投票就在那里。以上是C#学习教程:EF:DbContext上禁用“AutoDetectChangesEnabled”和“ProxyCreationEnabled”时,从多对多关系中创建/删除关系的全部内容,如果对大家有用需要想了解更多C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: