【问题标题】:Bring back DbContext.Detach() method with an extension method (EF5) [duplicate]使用扩展方法(EF5)带回 DbContext.Detach() 方法 [重复]
【发布时间】:2013-05-17 08:45:38
【问题描述】:

Entity Framework 5 中的DbContext 上没有Detach(object entity)

要分离实体,现在需要更改状态。也许我遗漏了一些东西,但这似乎比使用 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() 方法的原因是什么?

【问题讨论】:

  • “我很想创建一个扩展方法”——为什么要为一个你可以完全控制的类创建一个扩展方法?可以直接添加到WIMTEntities

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我不知道为什么没有 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();
    } 
    

    【讨论】:

    • 注意 this answer 表示 AsNoTracking 可能不等同于 Detach。
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2011-05-12
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多