2011-07-13 11 views
3

私は次のプロジェクトでEntity Framework 4.1を使用する予定ですが、それについては良い方法を見つけることができません。つまり、エンティティがWebサービスを介して移動する多層アプリケーションを構築し、できるだけクリーンな状態に保つために、自己追跡エンティティではなくPOCOを使用したいと考えています。また、エンティティのベースに使用されるSQL 2008データベースが既に存在します。DbModelBuilderに.edmxをロード

私がこれまでに(とりわけhttp://msdn.microsoft.com/nl-nl/magazine/hh148150%28en-us%29.aspxにジュリーラーマンの記事から)何を読んでから、ようです:あなたはデータベースの最初のアプローチを使用する場合は、編集する美しい.edmxを取得

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

私は、それが他の方法で回避を使用するように設計されたため、「DbModelBuilderウェイ」はそれほど労力を必要とする理由があることを認識:あなたは、エンティティの定義からデータベースを生成することになっていますすべてのエンティティを調整して、既存のデータベースに一致するようにしないでください。しかし、最終的には、「DbModelBuilder-way」がデータベースのメタデータを持たない純粋なPOCOの最良の結果を生むように思えます。

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

データベースの最初のシナリオと同じようにマッピングを視覚的に編集でき、必要なすべてのメタデータがDbModelBuilderに保存されているため、きれいなPOCOを取得できるので、これは両方の世界で最高のものだと思います。

答えて

1

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

エンティティ接続文字列、つまり:

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

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

0

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

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

    EDMXモデルファイルと
  • データベースの最初のアプローチ
  • しかし:任意のEF特定のクラスからなし継承を持っている簡単なPOCO(プレーン旧CLRオブジェクト)を生成 - 彼らは絶対にプレーンなCLRクラスだ.....素敵なEDMXモデル持続-無知POCOクラス -

これはあなたの両方の長所を提供します。

+0

リンクをありがとう、私は間違いなくそれらを見ています。 – Astrotrain

1

何を話していますか?

あなたはデータベースの最初のアプローチを使用している場合は、 編集モデル内に美しい.edmxを得るが、あなたはいつも私に有用されていない、持続性を意識した オブジェクトではなく、POCOさんになってしまいます状況。

これは当てはまりません。 EDMXはほとんどすべてのコードを生成することができます。

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

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

誰もが道をDbContext T4ジェネレータであることをDbModelBuilder

に.edmxをロードする方法を知っています!

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

もちろん、すべてのツールは、データベースへの1:1マッピングであるモデルを作成します。もっと必要な場合は、モデルやマッピングを手動で変更する必要があります。

+0

あなたの答えをありがとう、私は間違っていると聞いてうれしい。 – Astrotrain

+0

あなたはEDMXがほとんど何でも作ることができると言いますが、私が理解している限り、EDMXエディタは2つのコード生成戦略しか持っていません:DefaultとNone - 私のknowlegdeには、 また、 "その方法はDbContext T4 generatorです"と言っていますが、既存のテーブルに相当するプレーンなC#相当のものしか取得できません。また、DbContext doens'tはデータベースにある外部キーの関係を理解し​​ているようです。何か間違っている? – Astrotrain

+0

はい、間違っています。実際にいくつかのチュートリアルを実行する必要があります。 DbContext T4 Generatorは、EDMXで定義されているものを作成しますが、その定義を変更することができます(EFでのグローバルな制限ではありません)。 DbContext Generatorに似たPOCOジェネレータもありますが、代わりにObjectContext APIを使用しています。関係はナビゲーションプロパティで表されます。インポートウィザードで外部キーの生成を有効にすることができます。しかし、永遠に無知な物を望みませんでしたか?オブジェクトの世界にどのように外来キーが属していますか? –

関連する問題