none
Entity Framework 4.1以降 コードファーストで作られたDBのその後について RRS feed

  • 質問

  • 2年ほど前に、下のリンク先の記事でEntity Frameworkのコードファーストの開発を知りました。

    ttp://www.atmarkit.co.jp/fdotnet/ef4basic/index/index.html#ef41

    その後、これ以上詳しい記事や、バージョンアップ後の記事なども見当たらず、ほぼここに書いてある知識だけでEntity Frameworkを使っています。

    現在実際はEntityFramework5.0を使用していますが、4.1にある機能しか使用していません。

    DBの作成先はSQL server Compact Edition 4.0 を使用しています。

    ここでちょっと困っているのが、コードファーストでDBを自動作成させてしまうと、後からテーブルにちょっとした変更を加えるだけでも、DB全部が作り直されてしまい全てのテーブルが空になってしまうことです。

    例えば、

    ・新たに未実施/完了済をチェックするのに既存のテーブルにbool型のフィールド1つだけ追加したい とか

    ・int型←→byte型 にフィールドの型を変更 とか

    ・文字列型←→数値型にフィールドの型を変更 など

    など、ちょっとした変更をテーブルに加えたい、という場合です。

    Accessなんかだと気軽に手軽にパッとできるのですが…。

    現状、私の知識では、DBまるごと作り直されてしまい、変更を加えていないテーブルも含めて全てのテーブルのデータが空になってしまいます。

    なので、一度CSVなど外部へエクスポートして退避させた後に、コード上のクラスの定義を作り直して、それにより自動で作り直される新たな空のテーブルに、退避したデータをインポートする…

    という方法でとりあえずはやっているのですが。

    もっと気軽に、できればテーブルのデータを消さずに残したまま、変更を加える方法はあるのでしょうか?

    それともやはり、毎回エクスポート/インポートで対応するしかないでしょうか?


    • 編集済み April19th 2013年5月15日 23:45
    2013年5月15日 23:43

回答

すべての返信

  • 当該記事ではDropCreateDatabaseIfModelChangesを継承してinitializerを作成しています。クラス名を読めばわかりますが、dropしてからcreate databaseしますからデータが消えるのも当然です。

    このクラスの含まれるSystem.Data.Entity名前空間を見渡すとMigrateDatabaseToLatestVersionクラスがあり、こちらを使えばデータを生かしたままマイグレーションできることがわかります。

    クラス名でググるとしばやんさんのEntity Framework 4.3 Beta 1 の自動マイグレーションを試してみたの記事などがヒットしますので参考にされてはどうでしょうか。

    • 回答としてマーク April19th 2013年5月16日 1:28
    2013年5月16日 0:19
  • 回答ありがとうございます。

    これで行けそうですね。

    最初に読んだ記事でこれ紹介してくれてたらと思うのですが、4.3以降ということなので、記事の時点ではまだ存在しなかったんでしょうね…。

    Entity Framewokに関しては、Googleなど使っても、古いバージョンの内容の記述などもたくさん混じって出て来てしまい、なかなか4.2,4.3とか5.0とかの情報を得られず、一番まとまっている感じの最初の記事で知識が止まってしまっていました。

    ありがとうございました。



    • 編集済み April19th 2013年5月16日 1:33
    2013年5月16日 1:32