MVC存储库 - 域模型与实体模型

Dis*_*ile 5 .net c# asp.net-mvc repository-pattern asp.net-mvc-3

我创建了一个使用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
Run Code Online (Sandbox Code Playgroud)

我生成了一个实体模型,最终看起来像这样:

Project
|
---->ProjectResources
     |
     ---->Resource
Run Code Online (Sandbox Code Playgroud)

我有一个返回项目的存储库:

public interface IProjectRepository
{
    Project GetProject(int id);
}
Run Code Online (Sandbox Code Playgroud)

和控制器动作:

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

    return View(project);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试POST这些数据时,这似乎不太好用.我在尝试重建ProjectResources集合时收到了EntityCollection已经初始化的错误.

我认为创建一个更简单的域模型更聪明:

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; }
}
Run Code Online (Sandbox Code Playgroud)

这似乎有点好,因为我也没有中间ProjectResources - >资源跳转.ProjectResource将包含我需要的字段.而不是做这样的事情:

@foreach( var resource in Model.ProjectResources ) {
    @Html.DisplayFor(m => m.Resource.FirstName)
}
Run Code Online (Sandbox Code Playgroud)

我可以:

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

我的问题如下: 我应该从我的存储库返回我的域模型还是应该由控制器或中间的其他类处理?如果它在控制器中通过将我的项目映射到ProjectEdit的东西来处理,那会是什么样子?

Ste*_*gan 5

我自己的观点是,您不应该向控制器或依赖于存储库实现的视图返回任何内容.

如果您将EF与POCO Generator一起使用,那么将这些类用于您的域模型是合理的,因为它们独立于EF实现(您可以替换EF并保留POCO).

但是,如果您将EF与其EntityObjects一起使用,我相信您应该转换为您的域模型.如果您的数据访问封装在内部使用存储库模式的WCF服务中,我不会太担心从存储库返回EntityObjects.但是,如果您直接从MVC使用存储库,请使用域模型作为存储库的接口.