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

C# MVC存储库-域模型与实体模型,c#,.net,asp.net-mvc,asp.net-mvc-3,repository-pattern,C#,.net,Asp.net Mvc,Asp.net Mvc 3,Repository Pattern,我已经创建了一个存储库,它使用Entity Framework从数据库返回数据,我需要将这些数据提供给我的视图,但在此之前,我需要将这些对象转换为我的域模型 我的模式如下所示: TABLE Project Id INT PRIMARY KEY Name NVARCHAR(100) TABLE Resource Id INT PRIMARY KEY FirstName NVARCHAR(100) LastName NVARCHAR(100) TABLE

我已经创建了一个存储库,它使用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
我生成了一个实体模型,结果如下所示:

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);
}
当我尝试发布这些数据时,这似乎不是很好。当尝试重建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; }
}
我可以做到:

@foreach( var resoure in Model.Resources ) {
    @Html.DisplayFor(m => resource.FirstName);
}
我的问题如下
我应该从我的存储库返回我的域模型,还是应该由控制器或中间的其他类来处理?如果它是由某个将我的项目映射到ProjectEdit的东西在控制器中处理的,那会是什么样子?

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

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


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

您所描述的正是我多年来一直在做的事情,与n层应用程序设计密切相关

因为数据的组织方式并不总是与域相同。正如您在这里所看到的,SQL中的自变量在您的域中并不总是相同的

通常,我的域知道存储库的外观,并具有与存储库进行转换的方法。我的UI/视图知道域的外观,并具有检索该数据(进入控制器)的方法


那么简短的回答,我想说,中间的东西(你的业务层),并揭露你的控制器可以使用的方法来接收这些数据。

我们倾向于总是使用一个VIEW模型作为“中间的类”,并用……< /P>映射到实际模型。

……或者


如果您希望的话,您的ViewModel在结构上可以与您的模型相当独立。

那么您是说我的存储库应该返回域模型而不是实体模型?如果您的存储库没有封装在单独的服务中,是的。