我有一种情况,我可能正在使用多个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
四年后这仍然如此吗?还是有一些内置的方法来检查这个? –