5

我是 MVC 新手,也是使用 EF 的新手。在我们的应用程序中,我们使用数据库优先方法。当我们使用 DB first 方法时,我们正在从 db 生成 edmx。

当我生成 edmx 时,它会为我的数据库中的表生成所有相关的分类。在这里,我很困惑是直接在我的视图中使用生成的类,还是应该在 EF 生成的类之上再创建一层类并从我的控制器和视图中使用它们。

如果我在实体之上再创建一层类,我必须处理这些类之间的映射。如果模型有任何变化,我怀疑这在未来可能会很痛苦。

如果我直接使用控制器中的实体,我觉得我将所有不必要的东西暴露给控制器和视图。

有人可以告诉我如何进行吗?

4

2 回答 2

3

你做得很好,只是你拥有它,你不需要改变它。您应该能够使用生成的类,或者如果您认为暴露太多,您可以创建一个视图模型,您将只填充您关心的数据并将其传递给视图。这就是 MVC 应该如何工作的。

假设您有一个名为的数据库表Articles,其中有很多您不想传递给视图的东西,您可以创建一个像这样的视图模型

public class ArticlesViewModel
{
    [Required] // this is optional, just to give you an idea of validation
    public string Title { get; set; }
    public DataTime Date { get; set; }
}

现在在你的控制器中你会有这样的东西:

ArticlesViewModel articleVM = new ArticlesViewModel();
// populate it from your DB

return View(articleVM);

所以现在你的视图只有Titleand Date,(你也应该有,这样你就可以轻松地从数据库ID中检索完整。)Article

将使您了解从数据库中获取所需信息。

于 2012-08-10T11:04:10.100 回答
2

您可能希望使用 NuGet 安装 POCO(普通旧 C# 对象 - 不依赖于其他功能(如 EF)的对象)生成器之一,这样您就可以将对象传递到视图层,而视图层不需要 EF 知识一点也不。

这被称为“关注点分离”或“单一责任原则”——您的视图知道如何显示数据,您的 DAL 知道如何检索和存储数据,并且两者都不应该知道关于做其他工作的细节。

如果您将 EF 对象向上传递,那么您还需要将 EF 知识和能力向上传递——传递 POCO 绕过了这一点。

看看这个 SO 主题:

Entity Framework 4 / POCO - 从哪里开始?

于 2012-08-10T10:27:35.550 回答