C# 实体框架与直接数据访问

C# 实体框架与直接数据访问,c#,asp.net,entity-framework,ado.net,C#,Asp.net,Entity Framework,Ado.net,我过去一直使用直接数据访问来处理对象(手动运行查询,并将结果映射到数据对象)。我知道微软目前正在推动EF,让他们的客户使用它来查询数据对象 关于这一点,我有几个问题要问社区:- 如果您有一个复杂的数据库,即几百个表、大量的存储过程、视图,那么一切都是3NF。管理两个模式(一个本地EF模式映射和一个DB)的负担值得权衡吗 一旦您开始加速数据访问,缓存在这两者之间的比较如何?我知道在DirectAccess中,您可以实现任何形式的缓存,EF是否允许类似的功能 考虑到微软在大力推动产品并让人们为其编

我过去一直使用直接数据访问来处理对象(手动运行查询,并将结果映射到数据对象)。我知道微软目前正在推动EF,让他们的客户使用它来查询数据对象

关于这一点,我有几个问题要问社区:-

  • 如果您有一个复杂的数据库,即几百个表、大量的存储过程、视图,那么一切都是3NF。管理两个模式(一个本地EF模式映射和一个DB)的负担值得权衡吗

  • 一旦您开始加速数据访问,缓存在这两者之间的比较如何?我知道在DirectAccess中,您可以实现任何形式的缓存,EF是否允许类似的功能

  • 考虑到微软在大力推动产品并让人们为其编写代码(SQL-NS、Linq to SQL)之后杀掉产品的历史,EF发生这种情况的可能性有多大

正如我所说的,目前我正在大量使用直接访问,但正在考虑迁移(即新的查询正在进行中,而不是刚刚对它们进行回溯),并且正在寻求社区其他人对其观点的建议

如果您有一个复杂的数据库,即几百个表,那么 大量的存储过程、视图和所有内容都在3NF中。是 管理两个模式(一个本地EF模式映射和一个本地EF模式映射)的负担 一分贝)值得交换吗

您可以使用自动化工具使您的EF模式保持最新,因此它并没有那么糟糕

一旦您开始加速数据访问,缓存的性能如何 两个?我知道在DirectAccess中,您可以实现任何形式的缓存 你想,EF允许类似的事情吗

据我所知,是的

考虑到微软在经历了严重的竞争之后一直在扼杀产品 推动他们,让人们为他们写作(SQL-NS, Linq对Sql)这件事发生在EF身上的可能性有多大

这个问题过于假设

EF的问题是它的性能。是的,你得到了快速的发展,但牺牲了表现。有了EF,编写糟糕而缓慢的代码非常容易,如果您不100%知道自己在做什么,以后可能会遇到一些严重的性能问题(特别是当您处理数百个表时)

我的建议是尝试一些微型ORM框架,比如Dapper或Massive。您不会牺牲太多性能,但它比传统的Ado.net方法更易于维护


但是,嘿,那只是我,你可能喜欢EF

使用EF或任何其他ORM工具需要记住的一点是,它只是将某些东西(对于EF和LINQ2实体,是Linq表达式树)转换成SQL语句。因为有一个额外的抽象层和解析层,所以直接查询总是比较慢。然而,开发人员通常更容易使用ORM。幸运的是,大多数ORM(尤其不确定EF)提供了在需要时仍然直接运行查询的方法

您提到有一个“复杂”的数据库,这通常意味着有复杂的查询。这是林克不喜欢的。例如,如果最终查询连接了13个表,并且几乎每个返回的列都被传递给一个db函数,并且有一组case语句和一组sub-select,那么几乎不可能转换为Linq。更简单的方法是将复杂性包装到视图中,然后使用EF只查询视图


另一方面,EF为开发人员提供了intellisense,因为构建真正的类是为了模拟DB。根据EF内容的布局方式,您可以将项目设置为所有类都从DB生成,因此如果有人编辑DB模式或更改列数据类型,您的C#代码将不再编译。对于传统的直接SQL查询,只有在运行时(或集成测试时)才能发现这一点


这是所有的权衡。。。在我看来,最好的办法是尝试这两种方法,看看你更喜欢哪一种,或者以这样一种方式设计一个解决方案,提供任何一种选择。在我开发的上一个应用程序中,我有一个其他数据访问类将使用的“数据库工厂”类(工厂模式),它们可以向工厂请求一个普通的旧ADO.NET命令对象,或者请求ORM对象(EF案例中的上下文,但我使用的是亚音速,因此它是一个IQueryable实现)。通过这种方式,您可以通过EF执行“简单”查询,也可以通过SQL执行“复杂”查询。

与直接数据访问相比,EF的主要优点是开发人员的生产力

很少有开发人员再编写汇编代码,我们让编译器生成汇编代码。随着像EF这样的工具变得更好,我们将更多地使用它们,并停止编写SQL

但是,有时您需要额外的控件来获得所需的性能,因此您可能仍然需要编写一些SQL代码。与此相同,仍有一些汇编代码正在编写中


转换有效的解决方案没有任何商业价值。您可以尝试EF进行新的开发。

+1。虽然“大”框架可能有点慢,特别是在不小心使用时,但它们在开发过程中确实非常方便。如果某个地方确实存在性能问题,那么就需要进行优化。至少,衣冠楚楚的人应该做到这一点——我只是觉得直接访问数据和“手动”映射太令人厌烦了。:)“因此,如果有人编辑DB模式或更改列数据类型,您的C#代码将不再编译”这不是真的。。如果有人在DB端更改了您的模式,而您没有对EF模式进行更改,那么您最终会遇到完全相同的情况-直到运行时才会发现…我的语句的意图是“您可以以这样一种方式设置您的项目,即每次编译时,类