2012-03-12 15 views
1

私はLINQtoSQLを使用して楽しくアクセスしてきた既存のデータベースを持っています。 SandersonのMVC3の本で私はEF4.3に亀裂があると思っていましたが、基本的な機能を動作させるためにも本当に戦っています。 SQL 2008での作業基本エンティティフレームワークの質問

、VS2010、フォルダのアーキテクチャがあるように思われる:例パー

ABC.Domain.Abstract 
ABC.Domain.Concrete 
ABC.Domain.Concrete.ORM 
ABC.Domain.Entities 

、リポジトリのインターフェイスは抽象的で、実際のリポジトリはコンクリートです。既存のデータベースからEDMXを作成するとORMフォルダに格納され、エンティティにはドメインの一部として設計したクラスが保持されます。ここまでは順調ですね。

ただし、

それは行方不明のキー文句
public DbSet<ABC.Domain.Entities.Person> Person { get { return _context.Persons; }} 

、その人はそれが概念モデルを見つけることができないことを、エンティティクラスではない、と...仕事をする方法と、DbContextクラス:私は一度一見シンプルEfDbContextを説得していませんそうです。

  1. web.configに基本的な接続文字列があるとします。簡単なマッチングを行うためにモデルを作成しないのはなぜですか?

  2. ORMフォルダが存在するか、それとも単にコンクリートであるべきですか? (LINQtoSQLコンクリート用の.SQLサブフォルダは.ORMを持っていますが、欠陥の場合は修正してください)。

  3. 私は自分のホームスピンのエンティティと自動的に生成されたエンティティを持つべきですか? 自動EntityObjectはEntityObjectから継承しています。私はcomplexTypeを持つPOCOまたはPOCOですが、何も継承しません。

  4. 家庭が設計したDomain.Entities.PersonタイプとContextのPersonsプロパティとの結びつきは? サンダーソンの本は、プロパティが同一であればそれが暗黙的であることを暗示していますが、そうではありません。

  5. app.configにはEF風の接続文字列があり、web.configには通常の接続文字列があります。どちらを使用するべきですか?今のところweb.configを前提としています - どうすればapp.configを削除できますか?

あなたのお手伝いがあります。長い時間が費やされ、現在は何日か進行していません。

+0

ようこそ!この質問は過度に広がっています。 [faq](http://stackoverflow.com/faq#dontask)をご覧ください。 –

+0

ありがとう!はい、知っています。しかし!私は、基本的なコンセプトよりも深く進んでいくことが大いに役立つだろうとは思わない!コードはセットアップの原理と比較して学術的です。SandersonのMVC3の本をよく知っている人なら、フォルダアーキテクチャによるソリューションの主な機能を推測できるはずです。正しいことを確認する方法がないため、特定のコードベースの質問をする方法がありません。 – David

+0

私は、特定の「あなたがチェックしましたか?」というような返信をしてもらえると願っていました。上記は単に質問のための私の理論です。 – David

答えて

1

ContigのPerson プロパティに自宅で設計したDomain.Entities.Personタイプとはどのような関係がありますか?

ここでは誤解があるようです。ドメインエンティティは、データベースのエンティティです。 2つのセットはありません。実際に何らかの理由で2組のオブジェクトクラスを用意したい場合は、2つのオブジェクトクラス間のマッピングを手動で記述する必要があります。 EFは、エンティティモデルの一部であるクラスについてのみ知っています。

また、EF 4.3を使用している場合は、DbContext Generator T4テンプレートをEDMXファイルに適用する必要があります。派生したエンティティEntityObjectで作業しないでください! DbContextではサポートされていません。ジェネレータは、一連のPOCOクラスを構築し、派生したDbContextを準備します。このPOCOクラスのセットは、DbContextが知っているだけのエンティティで、ドメインエンティティの唯一のセットでなければなりません。

作成DbContextは...

public DbSet<Person> People { get; set; } 

を自動ゲッターとセッターを持つ単純なDbSetプロパティが含まれています...とPersonクラスは、同様にPOCOとして作成されます。

+0

@David:Entity Frameworkには、一般的に2つのアプローチがあります。最初のものは古いものです。エンティティは、EntityObjectから得られます(=永続性には依存しません)。 2番目の方法は、バージョンEF 4.1(既にEF 4.0から始まっている)から(EFユーザーとMS開発チームでも同様に)推奨される方法であるPOCO(=永続性に依存しない)を使用する方法です。 POCOと非POCOの間には「ミラー」はありません。 EFにはPOCOを永続させる機能しかありません。エンティティは、永続化する必要があるかどうかをEFに「知らせる」のではなく、代わりに永続性ロジックをネーム規則または明示的な構成から推論します。 – Slauma

+0

新しいアプローチが私が目指しているアプローチです。ちょうどポコ。もちろん、私はすでにDBを持っているので、完全に自由な手がありません。コードでオブジェクトモデルを作成し、そこからEDMXファイルを作成し、それを既存のデータベースにマップするというプロセスがあると仮定できますか?私がやっていたことは、DBからモデルを更新することでした。継承された型が作成されます。私はこの時点でそれを消去し、少しでも害を与えてやり直すことができます。 – David

+0

@David:正確ではありません。コード(= "コードファースト"開発)から始める場合、EDMXファイルは必要ありません。あなたはPOCOクラス、DbContextクラス、マッピングコードとデータベースを持っています。 EF Code-Firstのウォークスルーを以下に示します。http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction- and-model.aspx – Slauma

0

エンティティフレームワークのパワーツールをダウンロードしてください: http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

右の既存のデータベースのリバースエンジニアリング」に、プロジェクトをクリックし、それはあなたのためのコードクラスを作成します。 EDMXを使用する必要はありません。このメソッドは、DbContextの派生クラスを作成します。

+0

偶然PAにいる場合は、ベツレヘムの近くの次の火曜日や今月末のVSLive Las Vegasの同様のセッションで、このセッション(ウェブアプリケーションのEF)についてセッションをしています。 –

0

ここでは多くの質問がありますが、回答は得られませんが、私は自分の5ペンを価値のあるものに固執します。

サンダーソンのMVC3帳

あなたの問題は、MVC3を行うにはない、彼らは、Entity Frameworkとデータ永続化層で行うことです。

ABC.Domain.Abstract ABC.Domain.Concrete ABC.Domain.Concrete.ORM ABC.Domain.Entities

これは、このような方法で分離され、なぜあなたが言うことができますか?私は、ABC.Domainには、あなたのパーシスタンス層(EF)とプレゼンテーション層(MVC)とは独立して、POCOを含めるべきだと主張します。リストには、ドメインにORMとデータアクセスエンティティが含まれていることが示されています。私はここで議論していない、私が言っていることは、あなたが本当に必要なものを理解する必要があるということです。

1日の終わりに、私は、ABC.DataAccess、ABC.Domain、ABC.Siteで簡単な例で十分であると確信しています。

なぜリポジトリが抽象的で具体的なのか理解していますか?そうでない場合は、インターフェイスを除外し、後でインターフェイスでインターフェイスを改善できるかどうかを確認してください。

Personはエンティティクラスではなく、概念的な モデルなどが見つかりません。

ここで、EFにデータを保存する方法はいくつかあります。最初にコードを使うことができます。名前が示すように、まずコードを書くと、EFはデータベース、関係、すべての関連する制約を生成します。

EFがデータベースから関連するクラスとデータに関連するオブジェクトを生成するデータベースを最初に使用できます。これはデータベース構造に大きく依存しているので、私にとってはそれほど好ましい方法ではありません。

EDMXデザイナーでクラスを設計するモデルを最初に使用すると、関連するSQLが生成されます。

これらはすべてブラックボックスのように聞こえるかもしれませんが、あなたが達成しようとしているものはすべて機能します。 EDMXは学ぶための良い方法であり、ASP.Netにはステップバイステップのチュートリアルがたくさんあります。

しかし、それが欠陥の場合は修正してください。

自分で修正してリファクタリングする必要があります。私の正直な意見では改善の余地がありません。私はあなたに別のフォルダ/名前空間構造を与えることができますが、常に "より良い"ものがあります。

私は自分のホームスピンのエンティティを持っていて、自動生成されたものを 、または1つだけセットする必要がありますか?

これは、選択したモデルによって異なります。データベースは最初に、コードは最初に、コードのみ、それ以外は何でも。ドメイン主導の開発に従っている場合は、ビジネスロジックを表すクラスで作業しなければならず、データ永続化レイヤーやプレゼンテーションレイヤーに束縛されないため、POCOは将来の道です。家を結びつける何

は人

にDomain.Entities.Personタイプを設計しさて、これは再び使用しているモデルによって異なります。

app.configファイルとweb.configファイル

あなたのWebアプリケーションを実行している、Webアプリケーションからの接続文字列が使用されます。私が間違っているなら、私を修正してください。

あなたのお手伝いがあります。長い時間が費やされ、いくつかの日の進歩はありません

一般的には、MVCを一時間だけ残してください。コンソールアプリケーションで動作させ、EFで提供されるオプションに慣れていることを確認してください。幸運:)何もコード-最初に働いていない理由は...

+0

Domain Drive Development for Dummiesとよく似ていますが、プロジェクトにはDDDが本当に必要ですか?ほとんどのプロジェクトは簡単なクライアントサーバーレイヤーアーキテクチャーで実行できるので、DDDで複雑な作業を省くときの要件を確認してください。 –

+0

使用したいモデルを決定しましたか?私はあなたがモデルを最初に使っているのか、コードだけを使っているのか、少し混乱しています。 –

+0

私は最初にコードで作業を開始できませんでした。 EDMXを使ってグラフィカルに設計することを探究しました。そして最後に、既存のDBをモデルにして、上のアドバイスに従って、codeGen T4ツールを使ってバックアップします。それは現時点では(まあ...)働いています。これは、私が期待していたものを私に与えてくれませんでしたが、第二のクラスのクラスでした。ですから、私はT4 gen'dを使ってビジュアルレイヤーの1つまたは2つ上に移動します。 – David

0

ソリューションは...これは、システムを読んでいるべき、接続文字列でSystem.Data.EntityClientへの参照であることが判明しました.Data.SqlClient。

このプロバイダのエントリが間違っていないと、コードを先に処理できませんでした。

どの接続文字列を使用していたのかは、選択した接続のキーワードを故意に間違って入力した場合です。これらはすべて正しく名前が付けられていましたが、app.configとweb.config 。アプリケーションでドメインモデルを作成しようとしてエラーが発生したときに、派生したDbContextクラスが使用していた接続文字列を識別するのは簡単でした。 ProviderNameを修正することで、すべての違いが生じました。

コード・ファーストはモデル変更時に値をシード値として使用しています。

+0

このシナリオでは、フォルダのアーキテクチャが違いはないと言いました。名前空間に影響しますが、それはそれです。 – David