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

时间:2013-05-22 10:26:48

标签: c# .net entity-framework entity-framework-5

实体框架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()方法的原因是什么?

2 个答案:

答案 0 :(得分:16)

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

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

另一方面,手动将状态设置为ModifiedAddedDeleted始终只对提供的对象起作用,而不是对相关对象起作用。调用Detach的{​​{1}}方法也是如此。仅通过将状态设置为ObjectContext来分离对象更符合其他状态更改的行为,因为设置任何其他状态只会影响提供的对象而没有相关对象。

Detached - 除了其他功能之外 - 旨在更轻松地使用Entity Framework。旧的DbContext方法更令人困惑,其行为与许多开发人员所期望的不同。 (Herehere是关于这种混淆和分离对象所涉及的复杂性的两个参考。)在我看来,从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();
}