8

Entity Framework 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;
}

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

4

2 回答 2

16

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

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

另一方面,手动将状态设置为ModifiedAddedDeleted始终仅作用于提供的对象,而不作用于相关对象。调用 的Detach方法也是如此ObjectContext。仅通过将状态设置为Detached与其他状态更改的行为一致来分离对象更为重要,因为与设置任何其他状态一样,它只会影响提供的对象而没有相关对象。

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

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

于 2013-05-22T11:53:06.893 回答
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();
} 
于 2013-05-22T11:24:37.927 回答