web-dev-qa-db-ja.com

Entity Framework Code-firstデータベースのデフォルトデータ

アプリの起動前またはデータベースの生成直後に既存のデータが必要な状況をどのように処理しますか。たとえば、コードファーストの生成後にデータベースにロードする国のリストがあります。どうすればいいですか?

アプリの構造は次のとおりです。

Repository > Service > WebMVC

XmlはWebMVCプロジェクトにあります。

45
Shawn Mclean

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; .....を追加することを忘れないでください.

67
Damb

たとえばDropCreateDatabaseIfModelChangesから派生したカスタムデータベース初期化子を作成し、オーバーライドされたSeedメソッドにデータを入力する必要があります。次に、Database.SetInitializerを使用して、アプリケーションの起動時に新しい初期化子を設定する必要があります。 ここ は、データベースにカスタムインデックスを作成するために使用される例(CTP5から)です。

11
Ladislav Mrnka

例については、 http://www.asp.net/entity-framework/tutorials#Using%20MVC の新しいMVC/Entity Frameworkチュートリアルシリーズを参照してください。#1と#4は両方とも初期化クラスを示します。

1
tdykstra