如何检查模型中是否存在DbContext.Set <T>?

我有一种情况,我可能正在处理多个DbContext,这些DbContext可能包含或不包含SomeEntity的DbSet。

当然,如果我点燃SaveChanges并且此实体不存在,则会发生以下错误:

实体类型SomeEntity不是当前模型的一部分   上下文。

如何检查实体或实体集是否存在于模型中,如果不存在,则将其中的违规位短路?

理查德

5
额外
意见: 1

3 答案

The exception should be thrown immediately when you call Set so the simplest way is to catch the exception and handle it as you need.

复杂的解决方案要求您浏览映射元数据并搜索您的映射实体类型,该类型必须与您的CLR类型具有相同的名称。您可以在派生上下文类中添加此方法以检查实体类型的存在性:

public bool Exists() where TEntity : class
{
    string entityName = typeof(TEntity).Name;
    ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext;
    MetadataWorkspace workspace = objContext.MetadataWorkspace;
    return workspace.GetItems(DataSpace.CSpace).Any(e => e.Name == entityName);
}
10
额外
谢谢。我使用了提供的方法。在我知道有异常的地方使用异常时,我总是感到不舒服。如果这是有道理的。
额外 作者 Richard,
四年后这仍然如此吗?还是有一些内置的方法来检查这个?
额外 作者 Zev Spitz,

我经常使用下面的实现。

(我已经在由上下文类实现的单独接口中声明了此方法。)

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

如果你看到它抱怨“任何()”扩展方法,只需粘贴“使用System.Linq;”如果失踪。

2
额外
为了澄清我的失望,这回答了错误的问题;接受的答案是正确的
额外 作者 AlexFoxGill,

这是我简化的答案:

public partial class MyDbContext : DbContext
{
   public bool Exists() where Tx : class
   {
       var attachedEntity = this.ChangeTracker.Entries().FirstOrDefault();
       return (attachedEntity != null);
   }
}
0
额外