ASP.NET MVC + EntityFramework で初期値投入に手こずったときに見直すこと
新しいプロジェクトを作るといつも DB に初期値を放り込むまでの手順を忘れるので自分用の備忘録として残す。
情報
-
Getting Started with Entity Framework 6 Code First using MVC 5
-
Data Developer Center > Learn > Entity Framework > Get Started > Config File Settings
構成
- ~/Models/Config.cs
- ~/Repositories/MyContext.cs
- ~/Repositories/MyInitializer.cs
手順
新規 MVC プロジェクトを作成した状態から、モデル Config の内容が初期化されるまでの手順を示す。
- モデル Config を定義する。
public class Config
{
public int Id { get; set; }
public string Key { get; set; }
public string Value { get; set; }
}
- DbContext から派生した MyContext を定義する。
public class MyContext : DbContext
{
public MyContext() : base("MyStore")
{
// Lazy Loading を禁止する - お好みで
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Config> Configs { get; set; }
}
-
MyInitializer を定義する。
public class MyInitializer :
//DropCreateDatabaseIfModelChanges
//DropCreateDatabaseAlways // 初期はこれが便利
CreateDatabaseIfNotExists
{
protected override void Seed(MyContext context)
{
base.Seed(context);
// Config エンティティを初期化
var configs = new List<Config>
{
new Config { Key = "key1", Value = "value1" },
new Config { Key = "key2", Value = "value2" }
};
configs.ForEach(x => context.Configs.Add(x));
context.SaveChanges();
}
}
- Web.config 設定を更新する。
```xml
<connectionStrings>
<add name="MyStore" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MyStore;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionString>
<entityFramework>
<contexts>
<!-- MyTest はアセンブリ名、ビルドしたときにできる dll の主ファイル名と思ってよし -->
<context type="MyTest.Repositories.MyContext, MyTest">
<databaseInitializer type="MyTest.Repositories.MyInitializer, MyTest" />
</context>
</contexts>
</entityFramework>
- Web.config の代わりにコードで初期化クラスを指定する場合は、
// Global.asax
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
Database.SetInitializer(new MyInitializer());
}
}
-
スキャフォールディングを使って、コントローラを生成する。
-
アプリケーションを実行し、生成したコントローラを呼び出す。
http://localhost:60444/Configs/Index
-
すると、
- スキャフォールディングが出力したコントローラが生成され、その過程で、
- DbContext が生成され
- Initializer.Seed が呼ばれてから
- アクションが実行される。
以上。
確認した環境
- ASP.NET MVC
- 日本語 Windows 10 Home 64ビット
- Visual Studio 2015 Community, IIS Express