2011-07-21 8 views
5

Entity Frameworkを使用してデータベースからデータを返すリポジトリを作成しましたが、このデータをビューに提供する必要がありますが、その前にこれらのオブジェクトをドメインモデル。MVCリポジトリ - ドメインモデルとエンティティモデル

私のスキーマは次のようになります。

Project 
| 
---->ProjectResources 
    | 
    ---->Resource 

私はプロジェクトを返すリポジトリを持っている:私はこのように見てしまったエンティティモデルを生成

TABLE Project 
    Id INT PRIMARY KEY 
    Name NVARCHAR(100) 

TABLE Resource 
    Id INT PRIMARY KEY 
    FirstName NVARCHAR(100) 
    LastName NVARCHAR(100) 

TABLE ProjectResources 
    Project_Id INT PRIMARY KEY -- links to the Project table 
    Resource_Id INT PRIMARY KEY -- links to the Resource table 

public interface IProjectRepository 
{ 
    Project GetProject(int id); 
} 

コントローラアクション:

public ActionResult Edit(int id) 
{ 
    Project project = projectRepository.GetProject(id); 

    return View(project); 
} 

このデータを試してPOSTすると、これはうまく動作しないようです。 ProjectResourcesコレクションを再構築しようとしたときにEntityCollectionが既に初期化されたエラーが発生しました。

が、私は少し単純であるドメインモデルを作成するために、よりスマートだと思う:これは私も中間ProjectResourcesを持っていないので、少しよりよいように思わ

public class ProjectEdit 
{ 
    public string ProjectName { get; set; } 
    public List<ProjectResource> Resources { get; set; } 
} 

public class ProjectResource 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

- >リソースジャンプ。 ProjectResourceには必要なフィールドがあります。 が、私は私のリポジトリから自分のドメインモデルを返却するか、それがコントローラによって処理されるべき次のように私の質問がある

@foreach(var resoure in Model.Resources) { 
    @Html.DisplayFor(m => resource.FirstName); 
} 

私にできること
@foreach(var resource in Model.ProjectResources) { 
    @Html.DisplayFor(m => m.Resource.FirstName) 
} 

:代わりのようなものを行います真ん中の他のクラス?それが私のプロジェクトをProjectEditにマップする何かによってコントローラ内で処理された場合、どうなっていますか?

答えて

5

私自身の見解では、コントローラまたはリポジトリの実装に依存するビューに何も返さないでください。

POCOジェネレータでEFを使用している場合は、EF実装から独立しているため(EFを置き換えてPOCOを保持できるため)、ドメインモデルにこれらのクラスを使用することは妥当です。

しかし、EntityObjectsでEFを使用している場合は、ドメインモデルに変換する必要があります。データアクセスが内部的にリポジトリパターンを使用したWCFサービスにカプセル化されていた場合、RepositoryからEntityObjectsを返すことについてはあまり心配しません。しかし、MVCからリポジトリを直接使用している場合は、ドメインモデルをリポジトリのインタフェースとして使用します。

+0

私のリポジトリはエンティティモデルではなくドメインモデルを返す必要があると言っていますか? – Dismissile

+0

リポジトリが別のサービス内にカプセル化されていない場合は、はい。 –

-1

私が何年もやってきたことは、n層アプリケーションの設計に従うことです。

データは常にドメインと同じように整理されるとは限りません。あなたがここに来たように、あなたのドメインでSQLと同じものになるわけではありません。

通常、私のドメインはリポジトリの外観を知っていて、変換元と変換元の方法があります。私のUI /ビューは、ドメインの外観を知っていて、そのデータを取得するためのメソッドを持っています(コントローラーに入ります)。

私は、中間のもの(あなたのビジネス層)に何かがあり、そのデータを受信するためにコントローラが使用できる方法を公開していると思います。

+0

はダウン投票者に説明してください。 – Jay

3

私たちは常に「途中でクラス」としてのViewModelを使用し、使用して、実際のモデルにしてからマッピングする傾向がある...

Automapper

...か...

ValueInjecter

あなたのViewModelは、望むならば構造に関してモデルからかなり独立しています。