使用扩展方法(EF5)返回DbContext.Detach()方法

Dav*_*New 8 .net c# entity-framework entity-framework-5

有没有Detach(object entity)对DbContext实体框架5.

要分离实体,现在需要改变状态.也许我错过了一些东西,但这似乎比使用该Detach方法更不直观和可读:

context.Entry(myEntity).State = EntityState.Detached;
Run Code Online (Sandbox Code Playgroud)

我很想创建一个扩展方法来恢复Detach方法:

public static void Detach(this MyEntities context, object entity)
{
    context.Entry(entity).State = EntityState.Detached;
}
Run Code Online (Sandbox Code Playgroud)

Microsoft删除EF 5中的DbContext.Detach()方法的原因是什么?

Sla*_*uma 16

Detach从(DbContext)API中删除方法有一些逻辑,因为Detach它不在对象图上操作,但它只分离传递给方法的单个对象.这与更改对象状态的所有其他方法不同:

  • Attach 附加提供的对象,包括导航属性的对象图中的所有相关对象
  • Add 将提供的对象(包括所有相关对象)添加到上下文中
  • Remove 删除提供的对象,包括已使用级联删除配置的相关对象

在另一方面手动设定状态Modified,Added或Deleted总是仅作用所提供的对象上,而不是在相关对象.这也是调用Detach方法的情况ObjectContext.更随之仅通过设置状态到脱离的对象Detached以与的,因为如设置它仅影响所提供的对象,而不相关的对象的任何其他状态等状态变化的行为线.

DbContext是 - 以及其他功能 - 旨在更容易使用Entity Framework.旧Detach方法更令人困惑,其行为与许多开发人员所期望的不同.(这里和这里有两个关于这种混淆的引用以及分离对象所涉及的复杂性.)在我看来,从DbContextAPI中删除它并不是错误的步骤.

好吧,你总是可以像你一样编写自己的扩展方法,或者ObjectContext如果你真的想拥有一个Detach方法,可以通过适配器访问底层.


quj*_*jck 5

我不知道为什么没有Detach()方法,但是DbSet类暴露了一个方法AsNoTracking()来获取与它分离的对象DbContext.

下面是一些示例代码在这里

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();
} 
Run Code Online (Sandbox Code Playgroud)