アプリの起動前またはデータベースの生成直後に既存のデータが必要な状況をどのように処理しますか。たとえば、コードファーストの生成後にデータベースにロードする国のリストがあります。どうすればいいですか?
アプリの構造は次のとおりです。
Repository > Service > WebMVC
XmlはWebMVC
プロジェクトにあります。
DropCreateDatabaseIfModelChanges
またはDropCreateDatabaseAlways
インターフェイスから継承するカスタム初期化子を作成します。お気に入り:
public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<-YourDbContext->
そして、Seedメソッドを次のように上書きします:
protected override void Seed(YourDbContext context)
全体の例は次のようになります。
public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<EntitiesContext>
{
protected override void Seed(EntitiesContext context)
{
List<Role> roles = new List<Role>
{
new Role {Id=1, Title="Admin"},
new Role {Id=2, Title="ProjectManager"},
new Role {Id=3, Title="Developer"}
};
// add data into context and save to db
foreach (Role r in roles)
{
context.Roles.Add(r);
}
context.SaveChanges();
}
}
編集:これを設定した後、ラディスラフ・ムンカが述べたように、イニシャライザも設定する必要があります。
Database.SetInitializer(new EntitiesContextInitializer());
例:Global.asaxの場合:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
Database.SetInitializer(new EntitiesContextInitializer());
}
using System.Data.Entity;
.....を追加することを忘れないでください.
たとえばDropCreateDatabaseIfModelChanges
から派生したカスタムデータベース初期化子を作成し、オーバーライドされたSeed
メソッドにデータを入力する必要があります。次に、Database.SetInitializer
を使用して、アプリケーションの起動時に新しい初期化子を設定する必要があります。 ここ は、データベースにカスタムインデックスを作成するために使用される例(CTP5から)です。
例については、 http://www.asp.net/entity-framework/tutorials#Using%20MVC の新しいMVC/Entity Frameworkチュートリアルシリーズを参照してください。#1と#4は両方とも初期化クラスを示します。