entity framework代码优先 – DbContext上没有Detach()方法
我想知道为什么在DbContext对象上没有像ObjectContext那样的Detach方法。 我只能假定这种疏忽是故意的,但我很难弄清楚为什么。 我需要能够分离和重新连接实体(例如,将caching放入ASP.NET项目中)。 然而,由于我不能分离一个实体,当我尝试附加一个与前一个上下文关联的实体时,我得到了“一个实体对象不能被IEntityChangeTracker的多个实例引用”exception。
这里有什么指导? 我错过了什么吗?
对于那些可能会碰到这个问题的人,现在需要写CTP5
((IObjectContextAdapter)context).ObjectContext
为了得到ObjectContext。
DbContext在内部使用ObjectContext,EF团队将其作为受保护的属性提供,以防万一您需要将其下载到较低级别的API,并且听起来像这样,所以您可以使用或公开所需的function的DbContext:
public class YourContext : DbContext { public void Detach(object entity) { ObjectContext.Detach(entity); } }
然后你可以从你的控制器调用这个方法来分离一个实体。
或者,您可以将其更改为具有更丰富的API:
public class YourContext : DbContext { public void ChangeObjectState(object entity, EntityState entityState) { ObjectContext.ObjectStateManager.ChangeObjectState(entity, entityState); } }
下面是DbContext从元数据中看起来的样子:
public class DbContext : IDisposable { protected System.Data.Objects.ObjectContext ObjectContext { get; } ... }
EF:CF 4.1 RC1和EF:CF 4.1 RTW具有相同的显式实现的IObjectContextAdapter:
public static class DbContextExtensions { public static void Detach(this System.Data.Entity.DbContext context, object entity) { ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext.Detach(entity); } }
微软决定“Detach技术太先进,应该隐藏起来”。 恕我直言,谁发明了这个人应该被枪杀 – 因为如果你添加全新的实体,否则很难删除它没有改变数据库(你可以使用DbEntityEntry操作,但这是另一回事)。
4年后编辑:
与EF6 (我以某种方式跳过了EF5 :))你不需要detach()
了,因为删除刚刚添加的条目不会生成delete from [table] where [Id] = 0
在EF4中 – 你可以调用mySet.Remove(myFreshlyCreatedAndAddedEntity)
,一切都会好起来的。
我通常使用以下属性扩展基类(从DbContextinheritance):
public class MyDbContext : DbContext { public ObjectContext ThisObjectContext { get { return ((IObjectContextAdapter)this).ObjectContext; } } }
后来你可以使用这个属性的各种有用的东西…像Detach 🙂
- Android – 何时注册/取消注册在活动中创build的广播接收器?
- 从ASP.NET MVC 3开始,MicrosoftAjax.js,MicrosoftMvcAjax.js和MicrosoftMvcValidation.js是否被废弃?