Репозиторий MVC - модель предметной области против модели сущности

Я создал репозиторий, который возвращает данные из моей базы данных с помощью Entity Framework, и мне нужно предоставить эти данные моему представлению, но перед этим мне нужно преобразовать эти объекты в мою модель предметной области .

Моя схема выглядит так:

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

Я создал модель сущности, которая в итоге выглядела так:

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

У меня есть репозиторий, который возвращает проект:

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

И действие контроллера:

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

    return View(project);
}

Это не Кажется, не очень хорошо работает, когда я пытаюсь отправить эти данные. Я получал уже инициализированную ошибку 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; }
}

Это кажется немного лучше, так как я также нет промежуточных ProjectResources -> Resource jump. ProjectResource будет иметь нужные мне поля. Вместо того, чтобы делать что-то вроде:

@foreach( var resource in Model.ProjectResources ) {
    @Html.DisplayFor(m => m.Resource.FirstName)
}

Я могу сделать:

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

Мой вопрос следующий Должен ли я возвращать свою модель домена из моего репозитория или это должно обрабатываться контроллером или каким-либо другим классом в середине? Если он обрабатывается в контроллере чем-то, что сопоставляет мой проект с ProjectEdit, как бы это выглядело?

5
задан Dismissile 21 July 2011 в 19:37
поделиться