0

Asp.net プロジェクトで EF Code First を使用しています。Code First はデータベースを正常に作成しましたが、データベースにデータをシードするのに適しています。次のようなカスタム データベース初期化子を使用しています。

namespace Toolkit.Model
{
    public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<ToolkitContext>
    {
        protected override void Seed(ToolkitContext context)
        {
            List<Server> Servers = new List<Server>
            {
                new Server { ServerName = "Server 16" },
                new Server { ServerName = "Server 29" }
            };

            foreach (Server server in Servers)
            {
                context.Servers.Add(server);
            }

            context.SaveChanges();
        }
    }
}

Global.asax.cs に初期化子を設定し、データベースを次のように強制的に初期化します。

using Toolkit.Model;

namespace Toolkit
{
    public class Global : System.Web.HttpApplication
    {

        void Application_Start(object sender, EventArgs e)
        {
            Database.SetInitializer(new EntitiesContextInitializer());
            var context = new ToolkitContext();
            context.Database.Initialize(false);
        }

        ...
}

問題は、イニシャライザが呼び出されないため、データベースにデータが入力されないことです。代わりに DropCreateDatabaseAlways を継承するように初期化子を変更しようとしましたが、まだ何もありません...ここで何が欠けていますか?

編集 データベースを削除した後、私のイニシャライザは正常に呼び出されました。ただし、テーブルを追加したとき (モデルが変更されたとき) や初期化子を DropCreateDatabaseAlways に変更したときなど、他のインスタンスで呼び出されなかったのはなぜだろうか。

4

4 に答える 4

0

オーバーライドされたmenthod、Seedの最後に、クラスのEntitiesContextInitializerで、メソッドの最後に次の行を追加します。

base.Seed(コンテキスト)

于 2012-12-26T13:25:16.933 に答える
0

試す

Database.SetInitializer<MyContextName>(new EntitiesContextInitializer)

EF 5.0 では、ライブラリは次のように宣言されています。

public static void SetInitializer<TContext>(IDatabaseInitializer<TContext> strategy) where TContext : DbContext;
于 2012-12-21T16:37:09.717 に答える
0

SQL CE データベースに同様の構成を使用していますが、DropCreate の代わりに CreateIfNotExists を使用しています。
私が持っているものとあなたのものの違いは、コンテキストを作成し、データベースで初期化を呼び出していることです。それに基づいて、 application_start メソッドにあるコンテキスト設定と Database.initialize 呼び出しを削除することをお勧めします。

于 2012-12-21T15:54:48.313 に答える
0

Code-First で Database Migrations を使用できます。モデルが変更されたときに Update-database コマンドを使用するたびに、シード メソッド (マイグレーション内) が呼び出されます。

この記事で詳しく説明します。

http://msdn.microsoft.com/en-gb/data/jj591621

Application_Start() で強制することもできます。

Database.SetInitializer(new EntitiesContextInitializer());
            var context = new ToolkitContext();
            context.Database.Initialize(true);
于 2012-12-21T17:33:19.140 に答える