gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:02:38 25 4
gpt4 key购买 nike

我创建了一个存储库,它使用 Entity Framework 从我的数据库返回数据,我需要将这些数据提供给我的 View ,但在我这样做之前,我需要将这些对象转换为我的域模型。

我的架构如下所示:

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);
}

还有一个 Controller Action :

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

return View(project);
}

当我尝试发布此数据时,这似乎效果不佳。在尝试重建 ProjectResources 集合时,我遇到了 EntityCollection already initialized 错误。

我认为创建稍微简单一点的领域模型会更聪明:

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 跳转。 ProjectResource 将具有我需要的字段。而不是做这样的事情:

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

我能做到:

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

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

最佳答案

我自己的观点是,您不应该向 Controller 或依赖于存储库实现的 View 返回任何内容。

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

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

关于c# - MVC 存储库 - 域模型与实体模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6781716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com