0

我正在尝试使用 CodeFirst EF。问题是它为每个域上下文(DbContext)加载了 50 多个表。如果我传递强名称类,则忽略工作,因此编译器知道它是什么,但是硬编码所有忽略将太难。

有没有办法遍历引用的 DLL 中的所有类并将其传递给忽略?我的代码很接近(从帖子中获取代码),但我想不出一种方法来传递带有程序集信息的类类型。我离得那么近又那么远……</p>

Assembly pocoQMAssembly = AssemblyInformationPOCO_QM.Get;
foreach (Type typeInfo in pocoQMAssembly.GetTypes())
{
    //Make sure it is not one of the classes used in DbSet<> 
    if (typeInfo != typeof(tbl_age_groups) ||
        typeInfo != typeof(tbl_axis)

        )
    { 
        //This line will show an error on typeInfo
        //Is there a way to cast it to a class in some way so it likes it?
        modelBuilder.Ignore<typeInfo>();
    }
}

这将暴露程序集以轻松获取它。

public class AssemblyInformationPOCO_QM
{

    public static System.Reflection.Assembly Get
    {
        get
        {
            return typeof(AssemblyInformationPOCO_QM).Assembly;
        }
    }
}
4

1 回答 1

1

这是一些代码,可以满足您的需求。它查找明确包含在 DbSet 属性中的所有类型,然后使用它来查找模型程序集中不在 DbSet 中的所有类型,然后对它们调用 Ignore。

public class MyContext : DbContext
{

    // DbSet properties go here

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var dbSetTypes = this.GetType()
            .GetProperties()
            .Where(p => p.PropertyType.Name == "DbSet`1")
            .Select(s => s.PropertyType.GenericTypeArguments.Single());

        var nonDbSetTypes = typeof(MyEntityClass).Assembly // <- replace MyEntityClass with one of your types
            .GetTypes()
            .Except(dbSetTypes);

        modelBuilder.Ignore(nonDbSetTypes);
    }
}
于 2013-04-09T21:24:52.913 回答