是否可以检查对象是否已附加到Entity Framework中的数据上下文?

.net entity-framework

尝试通过context.AttachTo(...)附加已附加到给定上下文的对象时,我收到以下错误:

ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。

有没有办法实现以下方面:

context.IsAttachedTo(...)

干杯!

编辑:

Jason概述的扩展方法很接近,但它对我的情况不起作用。

我正在尝试使用另一个问题的答案中概述的方法做一些工作:

如何使用Linq to Entities *从表中删除一行或多行而不先检索行?

我的代码看起来有点像这样:

var user = new User() { Id = 1 };
context.AttachTo("Users", user);
comment.User = user;
context.SaveChanges();

这工作正常,除非我为该用户执行其他操作,我使用相同的方法并尝试附加虚拟User对象。这失败是因为我之前已经附加了这个虚拟用户对象。我该如何检查?

一般承认的答案

这就是我最终得到的结果,效果非常好:

public static void AttachToOrGet<T>(this ObjectContext context, string entitySetName, ref T entity)
    where T : IEntityWithKey
{
    ObjectStateEntry entry;
    // Track whether we need to perform an attach
    bool attach = false;
    if (
        context.ObjectStateManager.TryGetObjectStateEntry
            (
                context.CreateEntityKey(entitySetName, entity),
                out entry
            )
        )
    {
        // Re-attach if necessary
        attach = entry.State == EntityState.Detached;
        // Get the discovered entity to the ref
        entity = (T)entry.Entity;
    }
    else
    {
        // Attach for the first time
        attach = true;
    }
    if (attach)
        context.AttachTo(entitySetName, entity);
}

您可以按如下方式调用它:

User user = new User() { Id = 1 };
II.AttachToOrGet<Users>("Users", ref user);

这很好用,因为它就像context.AttachTo(...)除了你可以使用我上面引用的ID技巧。您最终得到之前附加的对象或您自己的对象被附加。在上下文中调用CreateEntityKey可以确保它很好并且通用,并且即使使用没有进一步编码的复合键也能工作(因为EF已经可以为我们做了!)。


热门答案

一种更简单的方法是:

 bool isDetached = context.Entry(user).State == EntityState.Detached;
 if (isDetached)
     context.Users.Attach(user);


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因