簡體   English   中英

檢查實體框架中是否存在實體的通用方法?

[英]Generic Way to Check If Entity Exists In Entity Framework?

類似於檢查實體框架中是否存在 object 的最佳方法?

我正在尋找一種通用方法來檢查DbSet中的實體。 像這樣的東西,這是行不通的:

private DbContext DbContext { get; set; }

private DbSet<T> DbSet { get; set; }

public Boolean Exists(T entity) {
    return ((from item in this.DbSet
             where item == entity
             select item).Count() > 0);
}

where item == entity在 LINQ 到 SQL 中工作的行,但顯然不是 LINQ 到 Entities。 由於實體可能有不同的鍵,我不能讓它們全部繼承自具有已知鍵的公共抽象以進行比較。

我可以這樣做,但我擔心將捕獲異常作為驗證過程的性能 這也不起作用,因為只要分離了實體,就無法獲得OriginalValues屬性:

public Boolean Exists(T entity) {
    try {
        var current = this.DbContext.Entry(entity).OriginalValues;
        // Won't reach this line if the entity isn't in the database yet
        return true;
    }
    catch (Exception ex) {
        return false;
    }
}

如果實體存在,你想要通用的方式來檢查實體是否被上下文加載或者通用的方式來查詢數據庫嗎?

對於前一種情況使用:

public bool Exists<T>(T entity) where T: class
{
    return this.Set<T>().Local.Any(e => e == entity);
}

對於后一種情況使用(它也會檢查加載的實體):

public bool Exists<T>(params object[] keys)
{
    return this.Set<T>().Find(keys) != null;
}

編輯:

EF 代碼首先不應訪問此類信息,但可以獲取實體鍵的名稱。 我認為這樣的事情應該有效:

var objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objSet = objContext.CreateObjectSet<T>();
var keyNames = objSet.EntitySet.ElementType.KeyMembers.Select(m => m.Name);

但這一切都沒有意義。 您想要通用方法,但您的實體不共享必要的信息以允許通用方法。 現在你說你連鍵值都不知道。 使用這種“通用”方法將需要反思和手動構建表達式樹。

感謝@Ladislav 讓我朝着正確的方向前進。 下面是通用Exists()方法的代碼。

我想指出,這不需要反思,而且似乎表現得很好。 唯一讓我不高興的是TryGetObjectByKey()具有附加找到的實體的副作用。 因為我不希望Exists()有那個無意的結果,所以如果找到它,我必須分離實體。

public Boolean Exists(T entity) {
    var objContext = ((IObjectContextAdapter)this.DbContext).ObjectContext;
    var objSet = objContext.CreateObjectSet<T>();
    var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, entity);

    Object foundEntity;
    var exists = objContext.TryGetObjectByKey(entityKey, out foundEntity);
    // TryGetObjectByKey attaches a found entity
    // Detach it here to prevent side-effects
    if (exists) {
        objContext.Detach(foundEntity);
    }

    return (exists);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM