我有一个包含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和实体框架时的最佳实践,最好的经验法则是管理表示层,业务层和数据层应该发生什么,以及它们如何分开?
我知道这涉及到问题......
感谢您的帮助。
答案 0 :(得分:6)
确定。这是我对事物的看法......
首先,您的ViewModels
不应包含其中的复杂类型。复杂,是Entity Framework
的东西,等等。它们应该始终是简单和清理和 light 。视图不需要有关于持久性或数据库或诸如此类的任何知识。所有视图都需要知道应该呈现的数据。简单。
所以ViewModels
应该是POCO的 - > strings
,ints
,基本custom objects
和strongly typed collections
。
在控制器中,您应该将任何复杂类型转换为查看模型。我建议您使用AutoMapper
。
Here is a sample tutorial website我已经完成了向您展示the Controller如何将信息传递给ViewModel ..以及ViewModel is really simple。
答案 1 :(得分:0)
您收到此错误是因为您的域对象继承自EntityObject,因此它们不是持久性无知的。如果您希望它们不依赖于Entity框架库,则需要首先使用POCO生成模板或EF代码。
我个人认为在你的“演示”层中使用你的域对象是很好的,如果你没有构建一个巨大的,超级可维护的东西,完全由Automapper分离域模型,那就是完全过度使用。