51

edmxファイルがあり、データベースのテーブルを変更しました。「データベースからモデルを更新」ウィザードがあることは知っていますが、多くの場合、これは役に立ちません。

たとえば、フィールドをnull以外からnull許容に変更した場合、またはフィールドを削除した場合、更新モデルは変更を反映しません。モデルに変更を表示するには、エンティティを削除してから追加し直す必要がありました。

次の質問によると: データベースの変更を.edmxファイルに伝播するにはどうすればよいですか?

答えの1つは、エンティティを削除してから追加し直す必要があるという同じことを言っているようです。

これが決定的な答えですか、それともこれを行うためのより良い方法がありますか?

4

6 に答える 6

62

安全な方法でEDMXを更新する:

お気づきのとおり、データベースからの更新によって、既存のプロパティが常に正しく変更されるとは限りません。

EDMXアップデートの日常的な使用(24か月にわたる数百のアップデート)から、EDMXをアップデートするために次のシーケンスをお勧めします。

既存のモデルを削除してから更新します。

  1. EDMXデザイナーを開きます
  2. Ctrl-Aですべてを選択
  3. デザイナのすべてのモデルを削除するには、キーを削除します
  4. 重要:ソース管理にTFSを使用している場合は、この時点でEDMXを保存しないでください!*
  5. 次に、右クリックして[データベースからモデルを更新]を選択し、モデル全体を再作成します。
  6. プロジェクトを再構築して変更を伝達する

これにより、モデルに対して行った手動の微調整は明らかに失われますが、可能であれば手動の微調整は避けてください。これにより、プロセス全体をいつでも再現可能になります(これは良いことです)。

重要な注意事項:

  • Visual Studioで自動保存をオンにしている場合は、すべてを自動保存しないように、更新をすばやく選択する必要があります(上記の手順5)。
  • ソース管理にTFSを使用していて、EDMXを空にした後で保存した場合、TFSは生成されたすべてのファイルを「削除済み」としてマークし、EDMXを再度更新すると、ソース管理されていないファイルが切断される可能性があります。
  • このプロセスでは、ストアドプロシージャは更新されません。さらに、EDMXを更新しても、リターンタイプのみが変更されたストアドプロシージャは更新されないことがわかりました(EF 6.1.1の時点でまだ最新です)。

追加の推奨事項:

EDMXを別のライブラリに保管してください。これは、TTファイルや部分クラスを追加するのに最適な場所にもなります(たとえば、EDMXモデルの機能を拡張するため)。また、データベースコンテキストの拡張メソッドをこのライブラリに配置します。migrationファイルもライブラリで生成され、すべてが適切に含まれています。

2015年4月更新

Visual Studio 2013の最新のリリース4は、TFSの多くの問題を解決したようです。Visual Studioのチェックアウトで生成されたファイルが表示され、変更されていない場合は元に戻します。上記の手順は、依然として最も安全なアプローチのようです。

2015年9月の更新

最新のVS2013リリース5を使用すると、EDMXの更新中に保存が発生した場合でも問題が発生します。保留中の削除により、更新中にttファイルがソース管理から削除される状態になる可能性があります。秘訣は、ステップ4と5の間で高速に更新することです。:)

于 2014-05-27T09:39:37.733 に答える
45

重要な最初のステップは、モデルの更新ウィザードを使用したときに何が起こるかを正確に理解することです。

MSDNライブラリから:

ADO.NETエンティティデータモデルデザイナ(エンティティデザイナ)は、モデルの更新ウィザードを使用して、データベースに加えられた変更から.edmxファイルを更新します。モデルの更新ウィザードは、このプロセスの一部としてストレージモデルを上書きします。モデルの更新ウィザードは、概念モデルとマッピングにもいくつかの変更を加えますが、これらの変更は、オブジェクトがデータベースに追加された場合にのみ行われます。たとえば、テーブルがデータベースに追加されると、新しいエンティティタイプが概念モデルに追加され、列がテーブルに追加されると、新しいプロパティがエンティティタイプに追加されます。.edmxファイルに加えられた変更の詳細については、「モデルの更新ウィザードによって.edmxファイルに加えられた変更」を参照してください。

モデルの更新ウィザードを使用してデータベースを更新すると、概念モデルではなく、.edmxファイルのストレージモデルが更新されました。既存のオブジェクトの定義に変更が加えられると、ストレージモデルのみが更新されます。概念モデルは更新されません。モデルの更新ウィザードによって行われた変更の詳細については、上記の「モデルの更新ウィザードによって.edmxファイルに加えられた変更」リンクを参照してください。

モデルの更新ウィザードによって更新されないオブジェクトを更新する方法に関するいくつかのオプションを次に示します(列の定義が変更されたシナリオに基づく)。

  1. モデルの更新ウィザード(ストレージモデルを更新するため)を使用し、デザイナー(デフォルト)を使用して.edmxファイルを開き、目的のスカラープロパティを見つけて、プロパティウィンドウで目的のプロパティを編集します。
  2. モデルの更新ウィザード(ストレージモデルを更新するため)を使用し、XMLエディターを使用して.edmxファイルを開き、CSDL(概念モデル)セクションで目的のプロパティを見つけて、目的の属性を変更します。これは基本的にオプション1と同じですが、XMLを直接編集しています(ここで検索と置換が役立つ場合があります)。
  3. モデルブラウザから、概念モデルの[エンティティタイプ]セクションから目的のエンティティを削除し、ストレージモデルの[テーブル/ビュー]セクションから目的のテーブルを削除します。次に、モデルの更新ウィザードを使用してモデルを追加し直します。

最適なオプションは、特定のシナリオによって異なります。たとえば、1つの列の定義を変更したばかりの場合は、オプション1が最適な選択である可能性があります。1つのテーブルの複数の列の定義を変更した場合は、オプション3が最適な選択となる可能性があります。複数のテーブル(主キー/外部キーなど)で使用される列を変更した場合は、.edmxXMLを直接編集するのが最善のオプションかもしれません。

于 2012-03-14T20:39:06.897 に答える
1

あなたの質問と例を理解した場合、データベースのステップからモデルを更新し、Model.edmxダイアグラムに座ったら、変更するクラスのプロパティを強調表示して、そのプロパティを表示できます。 、およびそのNullableプロパティをNullable:Trueに変更します。これを行うには、少なくとも1つの方法があります。

ここでの考え方は、概念モデル(null以外からnull許容に変更されていない)は実際には基になるデータベーステーブルとは異なる可能性があるため、その部分は変更されず、その違いはまさに意図したものである可能性があると思います。私がこれを処理する2つの方法は、あなたが述べたように削除と追加を行うか、より一般的には私が述べたようにプロパティを手動で設定することです。

于 2012-03-14T19:02:00.270 に答える
1

既存のテーブルに新しい列(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> 

VisualStudioでプロジェクトをリロードします。

最後に、属性c1をモデルに追加します。

于 2016-11-23T15:37:13.010 に答える
0
  1. まず、.edmxファイルをダブルクリックします
  2. 次に、空のスペースを右クリックして、[データベースからモデルを更新]を選択します
  3. 第三に、メニューバーの[更新]タブを選択します。
  4. 最後に、更新するテーブルを選択して、[完了]を選択します。
于 2018-03-29T13:33:55.577 に答える
0

ステップ1:.edmxファイルをダブルクリックします。(図ウィンドウが開きます)

ステップ2:ダイアグラムウィンドウで、右クリックして[データベースからモデルを更新... ]を選択します(これで、更新ストレージでのみ更新され、モデルでは更新されません)

ステップ3:Model.ttファイルを右クリックし、 [カスタムツールの実行]をクリックします(これで、モデルでも更新されます)

それでおしまい!

于 2019-02-16T08:08:12.833 に答える