是否可以檢查對像是否已附加到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);


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因