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 に答える