Entity Framework Code Firstは、本番環境では少し意味がありません/役に立たないのですか?


29

私は最近Entity Framework 4.1 Code Firstでプログラミングをしており、開発にそれを愛していますが、最終計画と急速に変化する機能リストだけで、アプリケーションのニーズに合わせてクラス/データベースを常に変更しています。

開発では、ライブデータはなく、データベース全体を簡単に削除できるので、新しいスキーマで再作成されますが、ライブ時には明らかに、これは非常に悪いです!

私が見ることができる唯一の解決策は、メタデータテーブルを削除して手動でデータベースの同期を維持するか、基本的に削除して再シードすることです。

個人的には、データを再作成して移行するよりも列/テーブルを追加する方がはるかに簡単だと思うため、最初の方法を好みますが、何かを見逃していない限り、これはCode Firstから完全に離れています。

質問は本当に、最初の開発についてのCode Firstだけであり、実稼働環境でEFを管理するための優れた戦略は何ですか?


数日のためにこれを依頼することを意味して、それが最高のここまたはスタックオーバーフロー上にあったかどうかわからなかった...
wilhil

回答:


15

私の意見では、コードファーストの自動データベース作成は開発専用です。Stack Overflowで同様の質問に答え、データベースをアップグレードする方法と、本番環境で自動機能が悪い理由の両方を説明しました。

データベースのアップグレードは半手動のタスクです。テストされていない自動マジックはないはずです-さらに、EF 4.1では現在、そのようなマジックは利用できません(ADO.NETチームが取り組んでいる機能についてのプレゼンテーションのみがあります)。

この質問をチェックして Webサイトのアップグレード方法をよりよく理解することもできます。


また会いましたね!-あなたはEFの質問に迅速です!:) ...私はあなたなしではどこにいるか分からない!
ウィルヒル

数か月後、私のプログラムはかなり終了しました...これを答えとしてマークしていますが、何かが変わったのか、役立つリソースはありますか?
ウィルヒル

2
「Migrations」の最初のパブリックプレビューがリリースされました。blogs.msdn.com/b/adonet/archive/2011/07/27/...
ラディスラフMrnka

おかげで、今それを見て!Code Firstで開発するのが大好きでしたが、後で変更するのがとても不安/心配です!
ウィルヒル

StoredProcsまたはビューが、アプリケーションで使用されていないレポートなど、他の目的のためにDBで直接作成されたケースをどのように処理しますか。まず、コードでスキーマの変更の影響を受けるSPを知る必要があります。
softveda

5

アップグレードスクリプトを保守します

データベース自体で、スキーマのバージョンとともにレコードが保持されるテーブルを維持します。

アプリケーションを起動すると、バイナリによって使用されるはずのバージョンに対してバージョンが検出されます。異なる場合は、アップグレードスクリプトを実行(またはユーザーに依頼)します。

最初にデータベースをバックアップすることを忘れないでください。


次のステップ:あなたは解雇されます;)データベースの更新は、バックアップなしで自動的にahppenされるべきではありません-おそらく、あるユーザーが新しいバージョンを実行するときではなく、ダウンタイムで。あなたのアプローチは完璧です-大量のエラーで大規模な展開をシャットダウンします。
トムトム14

@TomTom:それは依存します。私たちは数年にわたってDBアプリケーションを完璧に実行していますが、これはまさにこれを行います。古いリリースを検出したときにアプリケーションが行う、新しいリリースの自動スキーマ変更です。バックアップも毎日行われ、すべてのスキーマの変更には後方互換性があります(フィールドとテーブルの追加のみ、削除は一切行われません)。変更に後方互換性がない場合、あなたが述べた対策が重要であり、すべてのクライアントアプリケーションが同時に更新されることを保証できないことに同意します(たとえば、大企業のDBの場合)。
Doc Brown 14

変更が自明でない場合は上に。2TBテーブルのフィールドを変更してみてください(そして、はい、私はこれに対処します-それはデータウェアハウスでもありません)。フィールドを追加するだけでクリーンアップすることはできないため、技術的負債を蓄積しているシナリオに自分自身を入れました。
トムトム14

2

この質問には、プログラミングモデルとランタイム環境との間に接続が存在しないという点で、何らかの欠陥があります。

最初のコードは、主に開発速度ドライバーであり、実際にはランタイムシステムに接続されていません。

実稼働環境では、dbモデルを削除/更新する可能性をランタイムが拒否する構成設定が適切にあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.