11

カスタム データベース初期化子で Seed メソッドを呼び出す際に問題が発生しています。私はEF 5.0を使用しており、次のコードがあります:

public static class MyDatabase
{
    public static void Initialize()
    {
        Database.SetInitializer(new MyInitializer());
    }
}

public class MyInitializer : DropCreateDatabaseAlways<MyContext>
{
    protected override void Seed(MyContext context)
    {
        base.Seed(context);
        context.Roles.Add(new Role
        {
            ID = 1,
            Name = "User",
        });
        context.Roles.Add(new Role
        {
            ID = 2,
            Name = "Admin",
        });
        context.SaveChanges();
    }
}

これら 2 つのクラスは、MVC アプリとは別のクラス ライブラリに存在します。で、メソッドGlobal.asaxを呼び出します。Initialize()

MyDatabase.Initialize();

データベースは問題なく作成さSeed(MyContext context)れます。メソッドが呼び出されず、データベースにデータが入力されないだけです。

4

3 に答える 3

13

データベースは、後でコンテキストを使用するときに作成されます。または、Global.asax.csのApplication_Start()メソッドでコンテキストを使用して、次のようにいつでもデータベースを強制的に作成できます。

  System.Data.Entity.Database.SetInitializer(new MyInitializer());
MyContext db = new MyContext();
db.Database.Initialize(true);
于 2013-01-11T21:48:56.393 に答える
1

このSeedメソッドは、最初の SQL クエリをデータベースではなくデータベースに送信すると呼び出されますApplication_Start。例えば:

using (var ctx = new MyContext())
{
    var rolesCount = ctx.Roles.Count(); // should return 2
}
于 2013-01-09T17:23:23.943 に答える