アーカイブ

Archive for 2012年2月

コードファーストでSQL Serverを利用する接続文字列

コードファーストの説明ではこのエントリのようにSQL CE 4.0を利用するものが多いです。
雑誌の記事を書くにあたってSQL Serverを利用する方法を試行錯誤したのでまとめておきます。

1.接続文字列を書かない

接続文字列を記述していない場合は、デフォルトでSQL Server Expressのインスタンスが利用されます。
SQL Server Expressがインストールされていないマシンではエラーが発生すると思われます(未確認)。
このとき、データベース名はDbContextを継承したクラスのnamespaceを含んだ名前になります。
例えば"MvcApplication13.Models.MemberDB"というデータベースが作られたりします。

2.データベース名を指定するには

データベース名を指定するにはDbContextを継承したクラスと同じ名前の接続文字列を追加します。
このときInitial Catalogで指定した名前のデータベースが、指定したSQL Serverのインスタンスの中に作られます。
次のような記述であれば、MemberDBという名前のデータベースが作成されます。

例:
    <add name="MemberDB"
         connectionString="data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=MemberDB;"
         providerName="System.Data.SqlClient" />

 

3.ユーザーインスタンスを利用するには

一般的な開発ではSQL Server Express特有の機能であるユーザーインスタンスを利用して、データベースのmdfファイルをプロジェクトの内部に作成して利用しています。
このように作成するデータベースのmdfファイルをプロジェクトの中に含めたい場合、ユーザーインスタンスを利用するための設定とmdfファイルの配置場所を設定する必要があります。
これは次のような記述で実現できます。

例:
    <add name="MemberDB"
         connectionString="data Source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDbFilename=|DataDirectory|MemberDB.mdf;User Instance=True;Initial Catalog=MemberDB;"
         providerName="System.Data.SqlClient" />

この場合mdfファイルが作られても最初はソリューションエクスプローラの中に表示されませんが、すべてのファイルを表示させてmdfファイルをプロジェクトに含めれば、あとは通常の開発時と同様に扱えます。

ただし、ユーザーインスタンスを使っているときに注意が必要な点が一つあります。

  『データモデルを変更したからといってmdfファイルを削除しないこと』

適切なInitializerの設定をしていれば、モデルの変更時にデータベースを自動的に作り変えてくれます。
この機能を使わなくてもmdfファイルを消せば新しくデータベースが作られるのではないか、と思ってしまいがちですがそんなことはありません。
むしろよくわからないエラーがでてきて対処に困る、という状況におちいります(というかこれでハマりました)。

どうもmdfファイルを直接消してしまうとユーザーインスタンス側になんらかのゴミが残るようです。
もしおかしな状態になってしまったら、次のような処理でユーザーインスタンスの状態をクリアしてください。

1)PCを再起動する
2)再起動後、すぐにSQL Server Expressのサービスを停止する
3)以下のフォルダを削除する
      C:\Users\ログインユーザー名\AppData\Local\Microsoft\Microsoft SQL Server Data\SQLEXPRESS