ASP.NET MVC(試したのは5)で、entity frameworkを使ったmodelやサービス部を別のクラスライブラリプロジェクトに切り出した時に、update-databaseのやり方で若干ハマったのでメモ。

環境はVisual studio 2015 update3

結論から言うと

1
PM> Update-Database -StartupProjectName MVCアプリ -ProjectName クラスライブラリプロジェクト

でOK。

Class library

クラスライブラリ単独でmigrationできるように設定します。

Project作成

普通のクラスライブラリとして作成します。New Project->Templates=>Visual C#->Class Libraryです。

説明上プロジェクト名をLibSomethingとします。

パッケージ

Package Manager Consoleで、Default projectをLibSomethingとし(←かなり忘れがち)て、

1
PM> Install-Package EntityFramework

を実行。

DB Context

LibSomething.Modelsフォルダを作って、DbContextを継承したクラスを作ります。ここではSomethingDBContext。

この時点では中身は無くてOK。

1
2
3
4
5
6
namespace LibSomething.Models
{
    public class SomethingDBContext : System.Data.Entity.DbContext
    {
    }
}

migrationの有効化

クラスライブラリ上でマイグレーションを有効にします。

1
PM> enable-migrations

そうすっと、Migrations/Configuration.csが作られるはず。

エンティティーやMigrationの追加

Code Firstのお作法にのっとって、Modelsにエンティティクラスを作って、SomethingDBContextに

1
public virtual DbSet<HogeHoge> HogeHoges{ get; set; }

を追加します。んで、

1
PM> Add-Migration AddHogeHoge

ここまでで、code first migrationの体はなんとなくできましたが、update-databaseは?となるわけです。

ASP.NET MVCアプリ

同じソリューション内にASP.NET MVCアプリプロジェクトを作ります。

Classライブラリを参照して、connect stringを設定、update-databaseを実行します。

参照

Classライブラリプロジェクトを参照。

こっちでもPackage Manager Consoleで、Default projectをASP.NET MVCアプリプロジェクトとし

1
PM> Install-Package EntityFramework

connect string

Web.configに

1
2
3
<connectionStrings>
    <add name="SomethingDBContext " connectionString="Data Source=.\sqlexpress2012;Initial Catalog=SomethingDB;Persist Security Info=True;User ID=oreore;Password=oredayo" providerName="System.Data.SqlClient" />
  </connectionStrings>

connectionString部はちゃんとしたの書いてください。

update-database

ここが今回の肝です。

Default projectをASP.NET MVCアプリで、

1
PM> Update-Database -StartupProjectName MVCアプリ -ProjectName LibSomething

これでweb.configの接続文字列に指定したDBに対してマイグレーションが実行されるはず。

テストプロジェクトでは

テストプロジェクト(MSTest使用)では[AssemblyInitialize]でDBごと再作成したりしてます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[TestClass]
    public class INITDatabase
    {
        [AssemblyInitialize]
        public static void AssemblyInitialize(TestContext context) {
            AppDomain.CurrentDomain.SetData("DataDirectory", "R:\\"); //接続文字列に|DataDirectory|がある場合必要。
            // create database
            Database.SetInitializer(new CreateDatabaseIfNotExists<SomethingDBContext>());
            var db = new SomethingDBContext();
            db.Database.Delete();
            db.Database.Initialize(true);
        }
    }

app.configに

1
<add name="SomethingDBContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\sometest.mdf;Initial Catalog=sometest;Integrated Security=True" providerName="System.Data.SqlClient" />

とか書いときます。

正解かどうかは知りません。