C# 为什么EF实体要建立依赖关系以及POCO的需求

C# 为什么EF实体要建立依赖关系以及POCO的需求,c#,entity-framework-4,poco,C#,Entity Framework 4,Poco,我对IoC、依赖注入和单元测试还很陌生。我正在开始一个新的宠物项目,我正在努力把它做好 我计划使用存储库模式来协调数据。我要从存储库返回的对象将是从Linq到entities数据上下文中收集的对象(EF4) 我在MarkSeeman的“依赖注入”一书中读到,这样做会产生一个重要的依赖,并且肯定会使测试复杂化(这就是他在库项目中使用POCO对象的原因) 我不明白为什么。尽管对象是由LINQtoEntities上下文创建的,但我可以简单地调用构造函数创建它们,因为它们是普通对象。因此,我假设有可能创

我对IoC、依赖注入和单元测试还很陌生。我正在开始一个新的宠物项目,我正在努力把它做好

我计划使用存储库模式来协调数据。我要从存储库返回的对象将是从Linq到entities数据上下文中收集的对象(EF4)

我在MarkSeeman的“依赖注入”一书中读到,这样做会产生一个重要的依赖,并且肯定会使测试复杂化(这就是他在库项目中使用POCO对象的原因)

我不明白为什么。尽管对象是由LINQtoEntities上下文创建的,但我可以简单地调用构造函数创建它们,因为它们是普通对象。因此,我假设有可能创建假存储库,将这些对象转移给调用方

我还关心POCO类的自动生成,这不是很容易

谁能带点光来吗?对于一个解耦的可测试项目,POCO对象真的是必要的吗

**编辑:多亏了Yuck,我明白最好避免使用模板自动生成,这就引出了一个设计问题。如果我来自一个大型的遗留数据库,其中他的表承担了多种责任(不符合具有单一责任的类的概念),那么最好的处理方法是什么?


删除数据库不是一个选项;-)

不,它们不是必需的,它只是让事情变得更简单、更干净

POCO库不知道实体框架正在使用它。这允许它以其他方式使用——例如,代替视图模型。它还允许您在WCF服务的两侧使用相同的项目,从而无需创建数据传输对象(DTO)

从个人经验来看,只有两个例子,但肯定还有更多。一般来说,更少一个特定对象或一段代码知道谁在使用它或它是如何被使用的,这将使它在其他情况下更具适应性和通用性

您还提到了POCO类的自动生成。我不建议这样做。您是否计划从数据库结构生成类定义

我计划使用存储库模式来协调数据。 我要从存储库返回的对象是 将成为从Linq到实体数据上下文收集的对象 (EF4)

EF生成的默认类(不是POCOs)包含用于延迟加载的代理,并且绑定在hip-to-Entity框架中。这意味着任何其他想要使用这些类的类都必须引用所需的EF程序集

这就是马克·西曼所说的依赖。由于您现在依赖于这些非抽象类型,而这些非抽象类型又依赖于EF,因此您不能简单地将存储库的实现更改为不同的实现(即仅使用您自己的持久性存储),而不解决依赖于这些类型的类中的此更改


如果您真正只对EF生成的类型的公共属性感兴趣,那么您可以让EF生成的分部类实现一个基接口。将所需的所有属性放在该基本接口中,并将依赖项作为基本接口传入-现在您只依赖于基本接口,不再依赖EF。

谢谢您的宝贵时间。这对我来说很有价值。我想澄清一下POCO类的生成。虽然这是一个宠物项目,但我来自一个数据库结构(我对学习最好的方法很感兴趣)。自动生成类可以节省时间,并且在遗留项目中可以帮助轻松表示大型数据资产。无论如何,我知道最好避免使用模板自动生成。当您必须导入相当大的表时,最好的方法是什么?@user1171844我的意思是,您当然可以从数据库结构生成它们开始。但是EF提供的部分好处是允许您定义与db模式1:1不匹配的类。因此,您可以拆分表、合并相关实体等。在进行POCO项目时,请记住这一点。非常感谢;)。延迟加载这是我遗漏的一个重要细节。