0

プラグイン スタイルの方法論 ( ASP.NET MVC のプラグイン アーキテクチャ) を使用して、EF コードの最初のデータベースにデータを入力するアプリケーションがあります。PreApplicationStartMethod の間に、各プラグイン (dll) からオブジェクトのリストを取得して、エンティティ フレームワークに読み込みます。私はこの一般的なアプローチ(レコードをDBに挿入するための一般的な方法)を使用しようとしていますが、Tはプラグインで指定した特定のタイプではなくオブジェクトであると言われています。その結果、コンテキストにオブジェクト dbset がないため、挿入が失敗します。オブジェクトを手動で元のタイプに変換すると、同じことが起こります。

IModule.cs (メイン プロジェクト) パブリック インターフェイス IModule { List> Entities { get; } }

Module.cs (プラグイン)

public class Module : IModule
{
    public List<List<object>> Entities
    {
        get
        {
            List<List<object>> entities = new List<List<object>>();

            List<object> renderings = new List<object>();
            renderings.Add(new FieldRendering(1, "Text", "String"));
            renderings.Add(new FieldRendering(2, "Date", "Date"));
            renderings.Add(new FieldRendering(3, "Hidden", "Auto"));

            entities.Add(renderings);

            return entities;
        }
    }
}

PreApplicationInit (メイン プロジェクト)

[assembly: System.Web.PreApplicationStartMethod(typeof(Core.Modules.PreApplicationInit), "InitializeModules")]
public class PreApplicationInit
{
    private static Context context;

    public static void InitializeModules()
    {
        // code to pull in the modules (works, so suppressing for brevity)

        context = new Context();

        foreach (List<object> section in module.Entities)
        {
            foreach (object entity in section)
            {
                // Inspecting the entity object here indicates the correct type (FieldRendering)
                Add(entity);
            }

            context.SaveChanges();
        }
    }

    private static void Add<T>(T entity) where T : class
    {
        // Inspecting T here indicates the incorrect type (object)
        // Code fails here
        context.Set<T>().Add(entity);
    }
}
4

3 に答える 3

0

DbContext.Setジェネリック型パラメーターの代わりに型オブジェクトを受け入れるオーバーロードされたメソッドを使用します。

foreach (object entity in section)
{
    context.Set(entity.GetType()).Add(entity);
}

ジェネリック型パラメーターで使用される型は、コンパイル時に決定されます。この場合、エンティティのコンパイル時の型はobject. ジェネリック型パラメーターを使用する代わりに、エンティティのランタイム型を使用して、操作する DbSet を取得する必要があります。

セットに新しいエンティティを継続的に追加する必要がある場合は、コンテキストが各エンティティの変更を保存するときにスローされる例外をキャッチできます。

foreach (object entity in section)
{
    context.Set(entity.GetType()).Add(entity);

    try
    {
        context.SaveChanges();
    }
    catch (Exception e)
    {
        //do nothing
    }
}
于 2013-09-06T04:51:24.927 に答える