C# MVC存储库-域模型与实体模型
我已经创建了一个存储库,它使用Entity Framework从数据库返回数据,我需要将这些数据提供给我的视图,但在此之前,我需要将这些对象转换为我的域模型 我的模式如下所示: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
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在结构上可以与您的模型相当独立。那么您是说我的存储库应该返回域模型而不是实体模型?如果您的存储库没有封装在单独的服务中,是的。