8

2 つの DbContext を作成しました。1 つはアプリケーション構成用で、もう 1 つはログ用です。

その理由は、ロギング データベースに最大サイズを設定して、すべての空きディスク領域を使い果たしたり、他のデータベースの動作を妨げたりしないようにするためです。

私のglobal.asax.csファイルには、次のものがあります。

        protected void Application_Start()
    {

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        Database.SetInitializer<AdminContext>(new AdminInitialiser());
        Database.SetInitializer<LoggingContext>(new LoggingInitialiser());
    }

LoggingInitialiser の InitializeDatabase メソッドが呼び出されていません。これは、イニシャライザを 1 つしか設定できないためですか? 2 つの DbContexts の初期化子を持つ方法はありますか?

4

3 に答える 3

8

代わりに、DbContext コンストラクターで初期化子を設定します。

public class AdminContext : DbContext
{
    public AdminContext()
    {
        Database.SetInitializer(new AdminInitialiser());
    }
}

public class LoggingContext : DbContext
{
    public LoggingContext()
    {
        Database.SetInitializer(new LoggingInitialiser());
    }
}
于 2012-06-25T14:21:32.650 に答える
4

はい、できます。次のものに進む前に、初期化する必要があります。

  Database.SetInitializer<MyDBContext>(myInitializer);
  MyDbContext context = new MyDbContext();
  context.Database.Initialize(false);

  Database.SetInitializer<MySecondDBContext>(myInitializer);
  MySecondDbContext context2 = new MySecondDbContext();
  context2.Database.Initialize(false);

注:私は通常、依存関係リゾルバーから DbContext インスタンスを取得します...

于 2012-06-29T10:04:13.400 に答える
3

以下のように SetInitializer 呼び出しを静的コンストラクターに配置することをお勧めします。

    static ApplicationIdentityDbContext()
    {
        Database.SetInitializer(new IdentityDbInitializer());
    }

以下、MSDNより

静的コンストラクターは、静的データを初期化するため、または一度だけ実行する必要がある特定のアクションを実行するために使用されます。最初のインスタンスが作成される前、または静的メンバーが参照される前に、自動的に呼び出されます。

したがって、静的コンストラクターはデータベースの初期化に最適です。この手法を複数のデータベースに使用しましたが、うまく機能します。

于 2015-07-16T00:20:05.210 に答える