=发布评论作为答案=
自从几个版本之前(不确定是哪个版本),EF对象就已经是POCO了。如果您想要一个"EntityObject",则必须使用某种适配器(我认为有一种适配器可用于应用程序迁移,但我不建议将其用作新项目的一部分)。
如果您的模型类具有EF相关方法,则确实很糟糕。但是 EF 5 不会这样。自从4.1版以来,它们使用代理而不是扩展 EntityObject,正是出于这个原因 - 使其成为使用它们作为模型的良好实践。
只需查看您的.tt和生成的.cs文件。它们是纯粹的POCO。没有接口,也没有基类。如果您从entity framework获取对象并检查对象的类型,您会发现像 System.Data.Entity.DynamicProxies.Employee_5E43C6C196[...]
这样的东西。这是代理生成的类。但是,如果您做完全相同的事情,只是在此之前更改数据库上下文配置(dbContext.Configuration.ProxyCreationEnabled = false;
),您将获得一个漂亮的Employee实体!
因此,回答最初的问题,使用EF POCO作为模型是完全可以接受/良好的实践,但请确保将它们用作非持久化对象。
其他信息
您应该考虑DDD概念以及DDD兼容模式的实现,例如存储库或您感到舒适使用的任何内容。
您绝不能直接在视图中使用这些实体,持久性或非持久性。
您应该阅读有关AutoMapper的内容,以使您的生活更轻松(与存储库或独立使用很好)。它将促进从ProxyEmployee -> Employee -> ViewModel和相反的传输。
EF实体的可怕用法示例:
return View(dbContext.employees.First());
EF实体的 错误用法示例#1:
Employee e = dbContext.employees.First();
return View(new Employee { name = e.name, [...] });
EF实体的错误用法#2示例:
Employee e = dbContext.employees.First();
return View(new EmployeeViewModel{ employee = e });
EF实体的正确使用示例:
Employee dbEmploye = dbContext.employees.First();
Employee e = new Employee { name = dbEmploye.name, [...] };
return View(new EmployeeViewModel { employee = e });
EF实体的良好使用示例:
Employee e = dbContext.employees.First()
EmployeeViewModel evm = Mapper.Map<Employee, EmployeeViewModel>(e)
return View(evm)
EF实体的精彩用法示例:
Employee e = employeRepository.GetFirstEmployee()
EmployeeViewModel evm = Mapper.Map<Employee, EmployeeViewModel>(e)
return View(evm)
如何查克·诺里斯会做:
return View(EmployeeViewModel.Build(employeRepository.GetFirstEmployee()))
EntityObject
,而是使用自己的模型,然后将它们转换/附加到对象上下文中,你最终会得到基本相同的并发处理吗? - Bartosz