C# 使用扩展方法(EF5)带回DbContext.Detach()方法
实体框架5中的C# 使用扩展方法(EF5)带回DbContext.Detach()方法,c#,.net,entity-framework,entity-framework-5,C#,.net,Entity Framework,Entity Framework 5,实体框架5中的DbContext上没有Detach(对象实体) 要分离实体,现在需要更改状态。也许我遗漏了什么,但这似乎比使用Detach方法更不直观和可读: context.Entry(myEntity).State = EntityState.Detached; 我很想创建一个扩展方法来恢复Detach方法: public static void Detach(this MyEntities context, object entity) { context.Entry(entit
DbContext
上没有Detach(对象实体)
要分离实体,现在需要更改状态。也许我遗漏了什么,但这似乎比使用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()方法的原因是什么?我不知道为什么没有
Detach()
方法,但是DbSet
类公开了一个方法AsNoTracking()
来获取从DbContext
分离的对象
下面是来自的一些示例代码
从(
DbContext
)API中删除Detach
方法具有一定的逻辑性,因为Detach
不会对对象图进行操作,但它只分离传递到方法中的单个对象。这与更改对象状态的所有其他方法不同:
附加提供的对象,包括导航属性的对象图中的所有相关对象Attach
将提供的对象(包括所有相关对象)添加到上下文中Add
删除提供的对象,包括配置了级联删除的相关对象Remove
Modified
,Added
或Deleted
始终仅作用于提供的对象,而不作用于相关对象。调用ObjectContext
的Detach
方法也是如此。更重要的是,仅通过将状态设置为“已分离”“与其他状态更改的行为一致”来分离对象,因为与设置任何其他状态一样,它只影响提供的对象,而不影响相关对象
DbContext
是其他功能之一,旨在简化实体框架的使用。旧的Detach
方法更加混乱,其行为与许多开发人员预期的不同。(这是关于这种混淆和分离对象所涉及的复杂性的两个参考资料。)在我看来,从DbContext
API中删除它并不是错误的步骤
好的,如果你真的想要一个
分离
方法,你可以像以前一样编写你自己的扩展方法,或者通过适配器访问底层的ObjectContext
。“我很想创建一个扩展方法”——你为什么要为一个你完全控制的类创建一个扩展方法?您可以直接将其添加到wintentities
。注意表示AsNoTracking可能并不等同于分离。
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();
}