在Entity Framework中使用数据库第一种方法

时间:2012-08-10 10:12:33

标签: asp.net-mvc-3 entity-framework c#-4.0 orm asp.net-mvc-4

我是MVC的新手,也是使用EF的新手。在我们的应用程序中,我们使用Database first方法。由于我们正在使用数据库第一种方法,我们正在从数据库中生成edmx。

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

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

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

有人可以告诉我如何继续这个吗?

2 个答案:

答案 0 :(得分: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);

现在您的视图只有TitleDate,(您还应该有ID,这样您就可以轻松地从数据库中检索完整的Article。)< / p>

This会让您知道从数据库中获取所需的信息。

答案 1 :(得分:2)

您可能希望使用NuGet安装其中一个POCO(Plain Old C#Objects - 不依赖于其他功能的对象,例如EF)生成器,这样您就可以将对象传递到View层而不需要View层完全了解EF。

这称为“关注分离”或“单一责任原则” - 您的视图知道如何显示数据,您的DAL知道如何检索和存储数据,也不必知道关于执行此操作的私密内容其他工作。

如果您将EF对象传递到链上,那么您还需要将EF知识和能力传递给链 - 通过POCO绕过它。

看看这个SO主题:

Entity Framework 4 / POCO - Where to start?