实体框架5中Detach(object entity)
没有DbContext
。
要分离实体,现在需要更改状态。也许我错过了一些东西,但这似乎比使用Detach
方法更不直观和可读:
context.Entry(myEntity).State = EntityState.Detached;
我很想创建一个扩展方法来恢复Detach方法:
public static void Detach(this MyEntities context, object entity)
{
context.Entry(entity).State = EntityState.Detached;
}
Microsoft在EF 5中删除DbContext.Detach()方法的原因是什么?
答案 0 :(得分:16)
从(Detach
)API中删除DbContext
方法有一些逻辑,因为Detach
不能在对象图上运行,但它只会分离您传递到对象图中的单个对象方法。这与更改对象状态的所有其他方法不同:
Attach
附加提供的对象,包括导航属性对象图中的所有相关对象Add
将提供的对象(包括所有相关对象)添加到上下文Remove
删除提供的对象,包括已使用级联删除配置的相关对象另一方面,手动将状态设置为Modified
,Added
或Deleted
始终只对提供的对象起作用,而不是对相关对象起作用。调用Detach
的{{1}}方法也是如此。仅通过将状态设置为ObjectContext
来分离对象更符合其他状态更改的行为,因为设置任何其他状态只会影响提供的对象而没有相关对象。
Detached
- 除了其他功能之外 - 旨在更轻松地使用Entity Framework。旧的DbContext
方法更令人困惑,其行为与许多开发人员所期望的不同。 (Here和here是关于这种混淆和分离对象所涉及的复杂性的两个参考。)在我看来,从Detach
API中删除它并不是错误的步骤。
好吧,你总是可以像你一样编写自己的扩展方法,或者如果你真的想拥有DbContext
方法,可以通过适配器访问基础ObjectContext
。
答案 1 :(得分:5)
我不知道为什么没有Detach()
方法,但DbSet
类公开了一个方法AsNoTracking()
来获取与DbContext
分离的对象。
以下是here
的一些示例代码using (var context = new UnicornsContext())
{
// Query for all unicorns without tracking them
var unicorns1 = context.Unicorns.AsNoTracking();
// Query for some unitcorns without tracking them
var unicorns2 = context.Unicorns
.Where(u => u.Name.EndsWith("ky"))
.AsNoTracking()
.ToList();
}