3

次のプロジェクトで Entity Framework 4.1 を使用する予定ですが、適切な方法を見つけるのに苦労しています。要するに、エンティティが Web サービスを通過する多層アプリケーションを構築し、できるだけきれいに保つために、自己追跡エンティティではなく POCO を使用したいと考えています。また、エンティティのベースとして使用される SQL 2008 データベースが既に存在します。

私がこれまでに読んだことから (特にhttp://msdn.microsoft.com/nl-nl/magazine/hh148150%28en-us%29.aspxに関する Julie Lerman の記事から)、次のように思われます。

  • Database First アプローチを使用すると、モデルを編集するための美しい .edmx が得られますが、常に POCO ではなく永続性を認識するオブジェクトになってしまい、私の状況では役に立ちません。
  • Code First アプローチを使用する場合、「ADO.NET DbContext ジェネレーター」は部分的にしか役に立ちません。.edmx からエンティティを生成しますが、外部キーとカーディナリティを正しく取得するために必要なコードは生成しません。これは、コードがそのままでは機能しないことを意味します (- edit、not true、以下の私の投稿を参照してください -)。
    • a)POCOでデータ注釈を使用します。これは、POCOをデータベース情報で汚染し、EntityFrameworkアセンブリへの依存関係も作成するため、醜いものです。
    • b) DbContext.OnModelCreating に渡された DbModelBuilder を使用して、正しい外部キー、マッピングなどの情報 (つまり、「流れるような」API) を設定します。また、API は「流れるような」ものかもしれませんが、既存のデータベースと一致するようにこのすべての情報を正しく設定することは依然としてかなり困難です (そしておそらく保守不可能です) ( http://sessionfactory.blogspot.com/2011/04/conventionsを参照)。 -in-entity-framework-41.htmlのいくつかの例)。

「DbModelBuilder-way」が非常に多くの労力を必要とする理由は、それが逆に使用されるように設計されているためだと私は認識しています.それらは(うまくいけば)既存のデータベースと一致します。ただし、「DbModelBuilder の方法」は、最終的に最良の結果を生み出すように思えます。つまり、データベース メタデータを含まない純粋な POCO です。

さて、これをすべて言ったので、私の質問は次のとおりです。外部キー、列マッピング、およびその他の情報を流暢な API を介して手動で指定する必要がないように
、.edmx を DbModelBuilder にロードする方法を知っている人はいますか? ?

データベース ファーストのシナリオのようにマッピングを視覚的に編集でき、必要なすべてのメタデータが DbModelBuilder に格納されているため、きれいな POCO を取得できるため、これが両方の長所になると思います。

4

3 に答える 3

1

どうやら、使用する接続文字列のタイプに応じて、「ADO.NET DbContext Generator」から生成されたコードを使用する方法が 2 つあります。

エンティティ接続文字列を使用する場合、つまり:

<connectionStrings>
  <add name="MyDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

DbContext には、.edmx からのすべてのメタデータ (列マッピング、外部キー関係など) が入力されます。また、DbContext の OnModelCreating は実行されません。これは POCO を使用したデータベース ファーストであり、これが私が達成したかったことです。

私が間違っていたのは、通常のSQL接続文字列を使用して DbContext に渡したことです。これにより、まったく異なるタイプの動作が発生します。DbContext は現在空であるため、すべてのエンティティ クラスを探索し、規則を使用してこのためのデータベース スキーマを生成しようとします。OnModelCreating が呼び出され、このマッピングを微調整してからデータベースを生成することを期待しています。

つまり、解決策は、SQL 接続文字列ではなくエンティティ接続文字列を使用することでした。

于 2011-07-14T07:47:43.547 に答える
1

何言ってるの?

Database First アプローチを使用すると、モデルを編集するための美しい .edmx が得られますが、常に POCO ではなく永続性を認識するオブジェクトになってしまい、私の状況では役に立ちません。

そうではありません。EDMX は、最初にコードを作成できるほとんどすべてのものを作成できます。

Code First アプローチを使用する場合、「ADO.NET DbContext ジェネレーター」は部分的にしか役に立ちません。.edmx からエンティティを生成しますが、外部キーとカーディナリティを正しく取得するために必要なコードは生成しません。これは、コードがそのままでは機能しないことを意味します...

そうではありません。EDMX を正しく設定すると、必要なエンティティが正確に作成されます。

.edmx を DbModelBuilder にロードする方法を知っている人はいますか

その方法は DbContext T4 ジェネレーターです!

とにかく、確認できるツールがもう 1 つあります: EF Power Tools CTP1です。このツールは、既存のデータベースからコード ファースト マッピングを作成できます。

もちろん、すべてのツールは、データベースに 1:1 でマッピングされたモデルを作成します。さらに何かが必要な場合は、モデルまたはマッピングを手動で変更する必要があります!

于 2011-07-13T19:52:01.610 に答える
0

T4 POCO 生成テンプレートについて読む:

これらの T4 コード生成テンプレートを使用すると、

  • EDMX モデル ファイルを使用したデータベース ファーストのアプローチ
  • ただし、EF固有のクラスから継承されていない単純なPOCO(プレーンオールドCLRオブジェクト)を生成します-それらは完全にプレーンなCLRクラスです.....

これにより、優れた EDMX モデル永続性を無視した POCO クラスという両方の長所が得られます。

于 2011-07-13T19:49:33.457 に答える