我有一種情況,我可能正在使用多個DbContexts,這些DbContext可能包含或不包含SomeEntity的DbSet。如何檢查模型中是否存在DbContext.Set <T>?
自然地,如果我斷火的SaveChanges和該實體不存在,將發生以下錯誤:
的實體類型SomeEntity是不是模型用於當前 上下文的一部分。
如何檢查實體或實體集是否存在於模型中,如果不存在,則將有問題的代碼短路?
理查德
我有一種情況,我可能正在使用多個DbContexts,這些DbContext可能包含或不包含SomeEntity的DbSet。如何檢查模型中是否存在DbContext.Set <T>?
自然地,如果我斷火的SaveChanges和該實體不存在,將發生以下錯誤:
的實體類型SomeEntity是不是模型用於當前 上下文的一部分。
如何檢查實體或實體集是否存在於模型中,如果不存在,則將有問題的代碼短路?
理查德
當你調用Set<NotMappedEntityType>
所以最簡單的方法是捕獲異常,並根據您的需要處理它的異常應立即拋出。
複雜的解決方案要求您瀏覽映射元數據並搜索必須與您的CLR類型具有相同名稱的映射實體類型。您可以在派生的上下文類中添加此方法以檢查實體類型的存在:
public bool Exists<TEntity>() where TEntity : class
{
string entityName = typeof(TEntity).Name;
ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext;
MetadataWorkspace workspace = objContext.MetadataWorkspace;
return workspace.GetItems<EntityType>(DataSpace.CSpace).Any(e => e.Name == entityName);
}
我經常使用以下實現。
(我已經宣佈正在由上下文類實現一個單獨的界面這種方法。)
public bool EntitySetExists<T>(T entity) where T : class
{
return this.Set<T>().Local.Any(e => e == entity);
}
如果你看到它抱怨的情況下,「任何()」擴展方法簡單地粘在「使用System.Linq;」如果失蹤。
爲了澄清我的downvote,這回答了錯誤的問題;接受的答案是正確的 – AlexFoxGill
這是我的簡化的答案:
public partial class MyDbContext : DbContext
{
public bool Exists<Tx>() where Tx : class
{
var attachedEntity = this.ChangeTracker.Entries<Tx>().FirstOrDefault();
return (attachedEntity != null);
}
}
謝謝。我使用了提供的方法。在我知道有異常的地方使用異常時,我總是感到不舒服。如果這是有道理的。 – Richard
四年後這仍然如此嗎?還是有一些內置的方法來檢查這個? –