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

时间:2012-05-25 06:08:13

标签: entity-framework ef-code-first dbcontext

我的情况是我可能正在使用多个DbContexts,它们可能包含也可能不包含SomeEntity的DbSet。

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

  

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

我如何检查模型中是否存在实体或实体集,如果不存在则会将有问题的代码短路?

理查德

4 个答案:

答案 0 :(得分:10)

当您调用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);
}

答案 1 :(得分:0)

这是我简化的答案:

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

答案 2 :(得分:0)

EF Core 2.x更新的扩展方法:如果不存在,它将返回NotFound;如果在模型上定义了实体TEntity,则返回DbSetType或ViewType。

    public enum QueryType
    {
        DbsetType,
        ViewType,
        NotFound
    }

    public static class DbContextExtensions
    {
        public static QueryType GetQueryType<TEntity>(this DbContext context) where TEntity : class
        {
            var metaData = context.Model.FindEntityType(typeof(TEntity));

            if (metaData == null)
                return QueryType.NotFound;

            return metaData.IsQueryType ? QueryType.ViewType : QueryType.DbsetType;
        }
    }

答案 3 :(得分:-2)

我经常使用以下实现。

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

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

如果你看到它抱怨&#34; Any()&#34;扩展方法只需坚持使用System.Linq;&#34;如果失踪了。