使用ASP.NET MVC3和Entity Framework分离项目层的最佳实践

时间:2011-12-03 12:02:59

标签: asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4

我有一个包含MVC3 Web应用程序和包含Entity Framework文件的数据项目的解决方案。我有实体框架工作,但是当我尝试将一个Entity Framework Entity Item对象包含到我的一个视图模型中以传递给视图时,我收到以下错误

“System.Data.Objects.DataClasses.EntityObject”类型在未引用的程序集中定义。您必须添加对程序集'System.Data.Entity,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的引用。

我尝试添加对该程序集的引用,然后在项目中使用using语句包含它,但它似乎没有做任何事情。但是遇到这个问题也提出了一个问题:尝试在视图模型中使用实体框架实体项目是不是一个好主意?根据使用ASP.NET MVC3和实体框架时的最佳实践,最好的经验法则是管理表示层,业务层和数据层应该发生什么,以及它们如何分开?

我知道这涉及到问题......

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

确定。这是我对事物的看法......

首先,您的ViewModels不应包含其中的复杂类型。复杂,是Entity Framework的东西,等等。它们应该始终是简单清理 light 。视图不需要有关于持久性或数据库或诸如此类的任何知识。所有视图都需要知道应该呈现的数据。简单。

所以ViewModels应该是POCO的 - > stringsints,基本custom objectsstrongly typed collections

在控制器中,您应该将任何复杂类型转换为查看模型。我建议您使用AutoMapper

Here is a sample tutorial website我已经完成了向您展示the Controller如何将信息传递给ViewModel ..以及ViewModel is really simple

答案 1 :(得分:0)

您收到此错误是因为您的域对象继承自EntityObject,因此它们不是持久性无知的。如果您希望它们不依赖于Entity框架库,则需要首先使用POCO生成模板或EF代码。

我个人认为在你的“演示”层中使用你的域对象是很好的,如果你没有构建一个巨大的,超级可维护的东西,完全由Automapper分离域模型,那就是完全过度使用。