web-dev-qa-db-ja.com

コードファーストとデータベースファースト

既存のデータベースに基づいてEntityFrameworkモデルを作成し、モデルからPOCOエンティティを生成しました。私のweb.configの接続文字列はEntityFrameworkではなく、単なる標準の接続文字列です(CSDL、SSDL、MSL参照がありません)。

アプリケーションをコンパイルできますが、実行すると次のエラーが発生します。

データベースファーストおよびモデルファースト開発用のT4テンプレートを使用して生成されたコードは、コードファーストモードで使用すると正しく機能しない場合があります。 DatabaseFirstまたはModelFirstを引き続き使用するには、実行中のアプリケーションの構成ファイルでEntityFramework接続文字列が指定されていることを確認してください。データベースファーストまたはモデルファーストから生成されたこれらのクラスを使用するには、コードファーストで属性またはDbModelBuilder APIを使用して追加の構成を追加し、この例外をスローするコードを削除します


私の質問は、POCOが自動生成から来たことをコードのどこで認識し、どうすればコードファーストのように動作させることができるかということです。接続文字列でCSDLなどを参照したくありません。

20
grefly

接続文字列にメタデータがある場合、EFはそれがモデルファーストまたはデータベースファーストであると見なします。プレーンな接続文字列の場合、EFはそれがコードファーストであると見なします。ただし、最初にモデルの実行を開始したいが、EFに実際にコードを実行していると思わせる場合(これが実行していることです)、デフォルトではなく、DbContextコードジェネレーターを使用していることを確認してください。コードファーストのPOCOは、実際には「プレーンオールドc#オブジェクト」であり、特別なデータベースを認識したり、追跡機能を変更したりすることはまったくありません。 DbContextコードジェネレーターを使用するには、モデルダイアグラムを右クリックし、[新しいコード生成アイテムを追加...]を選択してから、ADO.NETDbContextジェネレーターを選択します。また、主キーと外部キーの名前の付け方や、単純なint IDよりも複雑かどうかによっては、「OnModelCreating」メソッドでオブジェクト間の関係をマッピングするためのコードを入力する必要があります。環境。行throw new UnintendedCodeFirstException();を削除し、マッピングコードに置き換えます。そうしないと、EFがすべての関係を把握できない可能性があります(依存するメタデータがないことを忘れないでください)。

お役に立てれば。

23
Brian Rogers

設定ファイルには次のものが必要です。

<connectionStrings>
<add name="<The name of your class>" 
     connectionString="metadata=res://*/<test>.csdl|res://*/<test>.ssdl|res://*/<test>.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=<your source>;initial catalog=<your db>;persist security info=True;user id=<your user id>;password=<your password>;multipleactiveresultsets=True;App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" />
</connectionStrings>
12

私は最初にデータベースを使用しており、EDMXで生成された接続文字列をスタートアップアプリケーションのapp.configにコピーすることでこれを解決しました。 1つはすでに存在していましたが、明らかに異なっていました

0
Sirentec