web-dev-qa-db-ja.com

データベースの変更でedmxファイルをどのように更新しますか?

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

たとえば、フィールドを非NULLからNULL可能に変更した場合、またはフィールドを削除した場合、更新モデルには変更が反映されません。モデルに変更を反映するには、エンティティを削除して追加し直す必要がありました。

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

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

これが決定的な答えですか、これを行うより良い方法はありますか?

43
dtc

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

MSDNライブラリ から:

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

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

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

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

最適なオプションは、特定のシナリオによって異なります。たとえば、1つの列の定義を変更したばかりの場合は、おそらくオプション1が最適です。単一のテーブルの多数の列の定義を変更した場合、オプション3が最適な選択である可能性があります。多数のテーブルで使用される列(プライマリ/外部キーなど)を変更した場合、.edmx XMLを直接編集するのが最適なオプションです。

36
timb

safe方法で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の間で高速に更新することです! :)

57
Gone Coding

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

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

1
itsmatt

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

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

ステップ2:ダイアグラムウィンドウで、右クリックして選択しますデータベースからモデルを更新...(今だけ更新します更新ストレージにありますが、モデルにはありません)

ステップ3:Model.ttファイルを右クリックし、Run Custom Tool(今ではモデルでも更新されます)

それでおしまい!

0
Chandan Y S
  1. まず、.edmxファイルをダブルクリックします
  2. 次に、空のスペースを右クリックし、「データベースからモデルを更新」を選択します
  3. 第三に、メニューバーの[更新]タブを選択します。
  4. 最後に、更新するテーブルを選択し、[完了]を選択します。
0
adi sinha