web-dev-qa-db-ja.com

Entity Framework 6.1とMVC 5を使用してデータベースからCode Firstを使用した後にモデルを同期するにはどうすればよいですか?

仮定

  • EF 6.1、MVC 5、VS 2013、C#を使用する

  • Toad DM SQL Server向けに設計された既存のデータベースモデルがあり、常に最新の状態に保つことが非常に重要です。

手順とメモ

  1. ADO.NET Entity Data Modelを使用して、モデルを生成するためにCode First from DatabaseEF 6.1の新機能)を選択しました。注:モデルクラスとDbContextクラスは正常に生成されましたが、NO .edmxまたは.ttファイルは生成されませんでした

  2. 次に、Entity Frameworkを使用して、ビューを備えたMVC 5コントローラーという新しい足場アイテムを追加しました。注:成功、コントローラーおよびビューの生成

質問

これからは、Code Firstを使用してデータベースを更新したくありません。代わりに、データベースの変更に基づいてモデルを更新する必要があります。次はどうする? edmxファイルがない場合、データベースからモデルクラスを更新できませんか?

56
gkaio

エンティティデータモデルウィザードのデータベースのコードファーストは、エンティティクラスをコードファーストスタイルで作成されたかのように作成する優れた仕事をします。 EDMXスタイルの「データベースからモデルを更新」と同様に、データベースの変更に応じてこれらのクラスを最新の状態に保つ方法があるかどうかを確認します。私が研究したことから、これは組み込みのツールを使用して不可能ですnot。ただし、次のような回避策があります。

製品テーブルと顧客テーブルを持つデータベースがあるとしましょう。もともと、StoreDBContextクラスを作成し、オブジェクトの1つとして製品を選択しました。次に、既存のコンテキストに顧客テーブルを新しいエンティティとして追加します。 Code First Wizardを使用してこれを行う方法は次のとおりです。

  1. 新しいエンティティデータモデルを作成し、StoreDBContextTempなどと呼びます Add new item
  2. 最初にデータベースウィザードオプションからコードを選択します code first from database
  3. 追加するオブジェクトとして顧客を選択し(顧客のみ)、ウィザードを完了します add table
  4. 新しく作成されたコンテキストファイルStoreDBContextTemp.cs、および新しく追加されたエンティティの仮想プロパティをコピーします。

public virtual DbSet<Customer> Customers {get; set;}

  1. これらの新しいプロパティを元のStoreDBContext.cs dbcontextクラス。
  2. StoreDBContextTemp.csを削除し、app.config/web.confgなどでStoreDBContextTempの接続文字列を削除します。
  3. StoreDBContextクラスでCustomerを使用できるようになりました

テーブルを追加または削除する場合は、フィールドを手動で調整する必要がありますが、少なくとも、モデルに新しいテーブルが追加されるたびに多数のプロパティを手書きする必要はありません。

50

もう1つのオプションは、プロジェクトから自動生成されたクラスを削除し、再度生成するだけです。このアプローチに従う間、前のデータモデルと同じ名前(DbContextから継承するクラス名)をデータモデルに付ける必要があることを確認する必要があります。

Data Model Name

8
Rajesh Pawde

三つのこと。

  1. Code Firstを使用する場合、.edmxはありません。

  2. Code First Migrationsを使用する場合は、最初にコードを記述し、その後、データベースに変更を移行する必要があります。これにより、生成されたコードを使用せずにコードをより整理することができます。これは利点です。

  3. Visual Studioには、逆のことを行うためのプラグインがあります。 Entity Framework PowerToolsを使用すると、データベースを選択してオブジェクトにマップできます。

https://visualstudiogallery.msdn.Microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

Brian Vander Plaatsの答えに追加することがもう1つあります。ステップ4では、新しいStoreDBContextTemp.cs/OnModelCreatingメソッドにあるものをコピーして、既存のStoreDBContext.cs/OnModelCreatingに追加することもできます。そうしないと、新しいコンテキストクラスを削除するときに、これらの構成の追加が失われます。

3
Gary Burgess