Edmxファイルがあり、データベースのテーブルを変更しました。 「データベースからモデルを更新」ウィザードがあることは知っていますが、多くの場合、これは役に立ちません。
たとえば、フィールドを非NULLからNULL可能に変更した場合、またはフィールドを削除した場合、更新モデルには変更が反映されません。モデルに変更を反映するには、エンティティを削除して追加し直す必要がありました。
次の質問ごと: データベースの変更を.edmxファイルに伝達するにはどうすればよいですか?
回答の1つは、エンティティを削除して再度追加する必要があるという同じことを言っているようです。
これが決定的な答えですか、これを行うより良い方法はありますか?
重要な最初のステップは、モデルの更新ウィザードを使用したときに何が起こるかを正確に理解することです。
MSDNライブラリ から:
ADO.NET Entity Data Model Designer(Entity Designer)は、Update Model Wizardを使用して、データベースに加えられた変更から.edmxファイルを更新します。モデルの更新Wizardは、このプロセスの一部としてストレージモデルを上書きします。更新モデルWizardも概念モデルとマッピングにいくつかの変更を加えますが、オブジェクトがデータベースに追加されたときにのみこれらの変更を行います。たとえば、テーブルがデータベースに追加されると新しいエンティティタイプが概念モデルに追加され、列がテーブルに追加されると新しいプロパティがエンティティタイプに追加されます。 .edmxファイルに加えられる変更の詳細については、「 モデルの更新ウィザードによって.edmxファイルに加えられた変更 」を参照してください。
モデルの更新ウィザードを使用してデータベースを更新すると、概念モデルではなく、.edmxファイル内のストレージモデルが更新されました。既存のオブジェクトの定義が変更されると、ストレージモデルのみが更新されます。概念モデルは更新されません。モデルの更新ウィザードによって行われる変更の詳細については、上記の「モデルの更新ウィザードによって.edmxファイルに加えられた変更」リンクを参照してください。
(列定義が変更されたシナリオに基づいて)モデルの更新ウィザードによって更新されないオブジェクトを更新する方法に関するいくつかのオプションを次に示します。
最適なオプションは、特定のシナリオによって異なります。たとえば、1つの列の定義を変更したばかりの場合は、おそらくオプション1が最適です。単一のテーブルの多数の列の定義を変更した場合、オプション3が最適な選択である可能性があります。多数のテーブルで使用される列(プライマリ/外部キーなど)を変更した場合、.edmx XMLを直接編集するのが最適なオプションです。
あなたが見つけたように、データベースからの更新は常に既存のプロパティを正しく変更するとは限りません。
日々のEDMX更新の使用(24か月にわたる数百の更新)から、EDMXの更新には次のシーケンスをお勧めします。
これにより、モデルに対して行った手動調整は明らかに失われますが、可能であれば手動調整は避けてください。これにより、プロセス全体がいつでも再現可能になります(これは良いことです)。
EDMXは別のライブラリに保管してください。これは、追加のTTファイルと部分クラスを追加するのに最適な場所になります(たとえば、EDMXモデルの機能を拡張するため)。データベースコンテキストの拡張メソッドもこのライブラリに配置します。migration
ファイルライブラリでも生成され、すべてが適切に含まれています。
Visual Studio 2013の最新のリリース4は、多くのTFSの問題を解決したようです。 Visual Studioチェックアウトで生成されたファイルを確認し、変更されていない場合は元に戻します。上記の手順は、依然として最も安全なアプローチのようです。
最新のVS2013リリース5を使用すると、EDMXの更新中に保存が発生した場合でも問題が発生します。保留中の削除により、更新中にtt
ファイルがソース管理から削除されましたになる状態になります。秘密は、ステップ4と5の間で高速に更新することです! :)
あなたの質問とあなたの例を理解したら、データベースステップからモデルを更新し、Model.edmxダイアグラムに座ったら、変更したいクラスのプロパティを強調表示し、そのプロパティを表示できます、NullableプロパティをNullable:Trueに変更します。これは、少なくとも1つの方法です。
ここでの考え方は、概念モデル(非nullからnull可能に変更されていない)は実際に基になるデータベーステーブルとは異なる可能性があるため、その部分は変更されず、その違いは意図したとおりになる可能性があると思います。これを処理する2つの方法は、前述のとおり削除と追加を行うか、より一般的には、前述のようにプロパティを手動で設定することです。
既存のテーブルに新しい列(c1)を追加したとします。次に、既存のエンティティモデルで同じものを更新するには、次のようにします。
メモ帳++で.edmxファイルを開きます。
必要に応じて、プロパティc1を.edmxファイルに追加します。たとえば、すべてのc0ノードの下にc1ノードを追加します。
<EntityType Name="table">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="c0" Type="nvarchar(max)" />
<Property Name="c1" Type="nvarchar(max)" />
</EntityType>
Visual Studioでプロジェクトをリロードします。
最後に、属性c1をモデルに追加します。
ステップ1:。edmxファイルをダブルクリックします。 (図ウィンドウが開きます)
ステップ2:ダイアグラムウィンドウで、右クリックして選択しますデータベースからモデルを更新...(今だけ更新します更新ストレージにありますが、モデルにはありません)
ステップ3:Model.ttファイルを右クリックし、Run Custom Tool(今ではモデルでも更新されます)
それでおしまい!