2013-01-09 17 views
12

カスタムデータベースイニシャライザでSeedメソッドを呼び出す際に問題が発生しました。これらの2つのクラスがMVCアプリから別のクラスライブラリに存在するDropCreateDatabaseAlwaysシードが呼び出されない

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(); 
    } 
} 

:私は、EF 5.0を使用して、次のコードを持っています。 Global.asaxでは、私はInitialize()メソッドを呼び出します。

MyDatabase.Initialize(); 

データベースはそれだけでSeed(MyContext context)メソッドが呼び出されていないですし、データは私のデータベースに入れていない取得し、うまく作成されます。

+0

好奇心を持たずに、メソッドの最後にbase.Seedを置くとどうなりますか? – IronMan84

+0

同じこと、それは呼ばれません。私はcontext.Roles.Addにブレークポイントを置き、決して壊れません。初期化子がWebプロジェクト自体ではなく、別のクラスライブラリにあることと何か関係がありますか?私はこれまでこれをやったことがあると思ったが、特に覚えていない。 –

+0

できます。すべてを静的なクラスに入れている可能性もあります。 – IronMan84

答えて

1

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

using (var ctx = new MyContext()) 
{ 
    var rolesCount = ctx.Roles.Count(); // should return 2 
} 
+0

データベースにクエリを送信しています。これはIntellitraceを使って確認できます。レイアウトでは、常に空になるデータのリストをドロップダウンに入力しています。私は存在しない役割にユーザーを保存しようとしています。 –

13

はあなたのデータベースは、あなたがあなたのコンテキストを使用する場合には、後に作成されるか あなたはいつものようにGlobal.asax.cs中のApplication_Start()メソッドでは、あなたのコンテキストを使用して作成し、それを強制することができます:

System.Data.Entity.Database.SetInitializer(new MyInitializer()); 
MyContext db = new MyContext(); 
db.Database.Initialize(true); 
+0

私はまだこれを試してみる機会がありませんでしたが、私がそうすると、どうなるか教えてくれます。提案していただきありがとうございます! –

関連する問題