DbContext API忽略每个实体

时间:2013-04-09 17:27:11

标签: entity-framework api dbcontext ignore

请帮忙! :(

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

有没有办法遍历引用的DLL中的所有类并将其传递给忽略?我的代码很接近(从帖子中获取代码)但我无法找到一种方法来传递具有Assembly信息的类类型。我离这么远很近......

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;
        }
    }
}

非常感谢任何帮助。

谢谢,

丹尼尔

1 个答案:

答案 0 :(得分: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);
    }
}