=发表评论作为答案=
EF 对象自几个版本以来就是 POCO(不确定是哪个版本)。如果你想要一个“EntityObject”,你必须使用某种适配器(我相信有一个适配器可以促进应用程序迁移,但我不建议将它用作新项目的一部分)。
如果您的模型类具有与 EF 相关的方法,那么这样做真的很糟糕。但 EF 5 不应该。我相信从 4.1 开始,他们使用 Proxies 而不是扩展 EntityObject 正是出于这个原因 - 将它们用作模型是一种很好的做法。
只需查看您的 .tt 和生成的 .cs 文件。它们是普通的 POCO。没有接口,没有基类。如果您从实体框架中获取一个对象并检查该对象的类型,您会发现类似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);
Chuck Norris是如何做到的:
return View(EmployeeViewModel.Build(employeRepository.GetFirstEmployee()));