web-dev-qa-db-ja.com

Entity Frameworkの既存のテーブルに新しい列を追加する

データベースのテーブルに新しい列を追加しました。テーブルは既存のEntity Frameworkモデルで既に定義されています。これを行う方法については、ほとんどの項目をここで確認しましたが、それでも失敗します。

少し背景がありますが、このエンティティモデルは少なくとも3年間更新されていません。そのため、私が追加している列とは別に、その間に追加されたが含まれていない列が他にもたくさんあることを知っています。私は約9か月前にプロジェクトを引き継ぎましたが、モデルを正常に更新することはできませんでした。

最初の試行:

  • Visual Studioでモデルを開きました
  • 背景を右クリック
  • 「データベースからモデルを更新...」をクリックしました
  • [更新]タブをクリックした
  • 選択したテーブル
  • 特定のテーブルを強調表示
  • 完了をクリックしました

結果:

  • 私のモデルにあった数十のテーブルのクラスが削除されました
  • 問題のテーブルは更新されませんでした

2回目の試行

  • すべてのソースを復元しました
  • 上記と同じですが、
  • 更新ウィザードを開いた後、[削除]タブをクリックしました
  • 選択したテーブル
  • 完了をクリックしました
  • すべてのテーブルが削除されました
  • EFモデルを保存/閉じる/開く
  • 更新に戻りましたWizard Addタブ
  • クリックされたテーブル
  • すべてを展開したときに表が表示されませんでした
  • テーブルレベルでチェックボックスをオンにしました

結果

  • 表は追加されませんでしたが、元々含まれていなかったものはすべて追加されました

回目の試行

  • すべてのソースを復元しました
  • 2つの.ttファイルを削除しました
  • 更新ウィザードを開きました
  • [すべて追加]をクリックしました

結果

  • 何も再作成されず、.ttファイルなどもありませんでした。

4回目の試行

  • 復元されたソース
  • EFモデルから削除されたテーブル
  • 更新ウィザードを開きました
  • [テーブルの追加]をクリックしました

結果

  • 私のモデルにあった多数のテーブルのクラスが削除されました
  • 問題の表は追加されませんでした

最終試行

  • モデルにエンティティを手動で追加しました

結果

  • すべてのコードをコンパイルして実行しましたが、値がデータベースから取得されたり更新されたりすることはありませんでした

私が重要なポイントにあり、モデルを更新しなければならないので、提供できるヘルプまたは方向は大歓迎です。

14
Rodney Buxton

「データベースからモデルを更新する」は、使用するのが難しく/遅く、エラーを起こしやすいです。あなたがおそらく欲しくない/必要としない他のものを生成します。そのため、必要な列を手動で追加するとうまく機能します。モデル/テーブルの数によっては、VSでファイルを開くのが非常に遅くなる可能性があるため、VSエディターの外部で行うことをお勧めします。

 1. So in Windows Exlorer,right click on the *.edmx file and open with Notepad (or Notepad++/Textpad).

 2. Search for the text <EntityType Name="YourTableNameToAddColumn">.

 3. Add the property <Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />

 4. Search for the text <MappingFragment StoreEntitySet="YourTableNameToAddColumn">

 5. Add mapping to the new column <ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>

 6. Save the *.edmx file
19
alltej

上記のalltejによる回答の補遺、および「このMSLの一部として指定された概念側のメンバーまたはプロパティ 'xxxxx'がMetadataWorkspaceに存在しない」というChris Walshの回答への回答。

.edmxファイル内の[〜#〜] two [〜#〜]場所で「プロパティを追加」を検索することを確認する必要があります。そうしないと、Chrisのエラーが発生します。

7
Ken.Fukizi

問題を見つけました。モデルを生成したときに、エラー113:多重度はロールでは無効です。作成が失敗したときに生成された他の16307エラーの中で気づかなかった。すべてが正常に動作することを修正したら。

ありがとう

2
Rodney Buxton

1.Windows Exlorerで、*。edmxファイルを右クリックして、メモ帳(またはNotepad ++/Textpad)で開きます。

2.テキスト<EntityType Name="YourTableNameToAddColumn">を検索します。

3.プロパティ<Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />を追加します。

4.もう一度テキストを検索します<EntityType Name="YourTableNameToAddColumn">、2つ目があります。

5.プロパティ<Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />を追加します。

6.テキスト<MappingFragment StoreEntitySet="YourTableNameToAddColumn">を検索します。

7.新しい列<ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>にマッピングを追加します。

8. * .edmxファイルを保存します

9.その後、テーブルのedmxモデルを更新しますpublic string YourNewColumnName { get; set; }

1
Nestoras Rose

テーブルにいくつかの列を追加し、edmxファイルが正常に更新される状況にあったときに、この質問を見つけました。ただし、コード生成が適切にトリガーされなかったため、.csファイルは更新されませんでした。 Entities.ttファイルを右クリックし、テキスト変換を実行する「カスタムツールの実行」を選択して修正しました。

0
DomenicDatti

警告:データベースを削除できない場合は、次の手順を実行しないでください!

Visual Code(.net 2)を使用しています。ここに私がそれを解決した方法があります:

まず、データベースを削除します。

dotnet ef database drop

次に、すべての移行を削除します。

dotnet ef migrations remove

移行が削除されるまで、同じコマンドを実行しますall

最初の移行を追加します。

dotnet ef migrations add InitialCreate

上記のコマンドを実行した後、生成された新しいファイル、おそらくData/Migrationsファイルで変更を行ってください:timestamp + InitialCreate設計ファイルではありません

画像の例: 新しい列の追加

列を追加し、すべてが一貫したものになったら、プロジェクトを保存して次のコマンドを実行します。

dotnet ef database update

すべて問題なければ、新しい列が作成されます。

0
LAT94