5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ASP.NET MVC + EntityFramework で初期値投入に手こずったときに見直すこと

Posted at

ASP.NET MVC + EntityFramework で初期値投入に手こずったときに見直すこと

新しいプロジェクトを作るといつも DB に初期値を放り込むまでの手順を忘れるので自分用の備忘録として残す。

情報

構成

  • ~/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

  • すると、

    1. スキャフォールディングが出力したコントローラが生成され、その過程で、
    2. DbContext が生成され
    3. Initializer.Seed が呼ばれてから
    4. アクションが実行される。

以上。

確認した環境

  • ASP.NET MVC
  • 日本語 Windows 10 Home 64ビット
  • Visual Studio 2015 Community, IIS Express
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?