Entity framework 每个实体的DbContext API忽略

Entity framework 每个实体的DbContext API忽略,entity-framework,api,dbcontext,ignore,Entity Framework,Api,Dbcontext,Ignore,请帮忙( 我正在尝试使用CodeFirst EF。问题是它为每个域上下文(DbContext)加载了50多个表。如果我传递强名称类,那么忽略将起作用,这样编译器就知道它是什么,但是硬编码所有忽略将太难了 有没有一种方法可以循环引用DLL中的所有类并将其传递给ignore?我的代码很接近(从post中获取代码),但我无法找到一种方法来传递包含程序集信息的类类型。我离得很近,但离得很远 Assembly pocoQMAssembly = AssemblyInformationPOCO_QM.Get;

请帮忙(

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

有没有一种方法可以循环引用DLL中的所有类并将其传递给ignore?我的代码很接近(从post中获取代码),但我无法找到一种方法来传递包含程序集信息的类类型。我离得很近,但离得很远

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>();
    }
}
任何帮助都将不胜感激

谢谢,


Daniel

下面是一些代码,它完成了您所要完成的工作。它会查找显式包含在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);
    }
}
公共类MyContext:DbContext
{
//DbSet属性在这里
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
var dbsetypes=this.GetType()
.GetProperties()
.Where(p=>p.PropertyType.Name==“DbSet`1”)
.Select(s=>s.PropertyType.GenericTypeArguments.Single());

var nonDbSetTypes=typeof(MyEntityClass).Assembly//为什么要忽略?数据库集不加载任何数据。数据库中有几百个表。所有表/类都在DLL中。它们有很多forien键,因此链接到的表比需要的多。因此数据库集具有所需的(10个表/类)但是60-80是映射的。所以我想忽略除DbSet中的表以外的所有其他表。检查DbSet中的表,然后什么都不做,然后删除重置比尝试删除不需要的表更容易。删除行在每个域上下文中为50-100+。好的,我从未使用过忽略。如果忽略一个在外键中链接到但没有数据库集?好的,我从未使用过Ignore。如果忽略在外键中链接到但没有数据库集的类,会发生什么情况?--在这种情况下,映射的相关表不会加载到元数据中。如果以后在Linq查询中需要它,可以使用.Include,它将加载数据。啊,对,Ignore有一个重载,可以接受IEnumerable类型,这能帮你吗?太棒了!非常感谢!嗨,我正在重写
IdentityDbContext
,并创建了一个自定义
IdentityUserLogin
,它的键由更多属性组成。现在我希望EF忽略
UserLogins
属性,而不是创建一个表和我已经试过
builder.Ignore()
但它似乎不起作用。我在尝试添加迁移时仍遇到错误
实体类型“Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin”需要定义一个键
我尝试隐藏基类的
UserLogins
属性,但随后错误是
找到了不明确的匹配项
我已找到所以尝试了“builder.Model.RemoveEntityType(builder.Entity().Metadata);”但没有成功。
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);
    }
}