Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用扩展方法(EF5)带回DbContext.Detach()方法_C#_.net_Entity Framework_Entity Framework 5 - Fatal编程技术网

C# 使用扩展方法(EF5)带回DbContext.Detach()方法

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

实体框架5中的
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();
}