我应该使用Entity Framework、DataSet还是自定义类?

13

我在这里真的很艰难。我需要设计一个“桌面应用程序”,它将使用WCF作为通信渠道。这是一个多层应用程序(数据库和应用服务器相同,客户端通过互联网云访问)。

该应用程序与通常的LOB应用程序相比有点复杂(在SQL和代码逻辑方面),但其概念相同:从数据库读取,更新到数据库,处理并发等。我的问题是,现在有了Entity Framework,我无法决定如何继续:我应该使用Entity Framework、数据集还是自定义类。

据我所知,使用Entity Framework会创建我的数据库表的对象映射以及CRUD脚本。对于简单的CRUD,这很好,但大多数时候,“选择”是复杂的,需要自定义SQL。我了解我可以在EF中使用存储过程(我不喜欢SP,我不知道为什么,我喜欢手工编写DAL中的SQL,这样感觉更安全和舒适)。

使用DataSet,我将使用自定义SQL并填充数据集。使用自定义类(用于DB表的对象),我将在这些自定义类(集合和列表等)上填充自定义SQL。我想使用EF,但我不确定部署一个我没有编写并且不能在代码中看到SQL的应用程序是否可靠。我在这里漏掉了什么吗。

任何关于此事的帮助将不胜感激。

Xeshu

3个回答

12

我完全同意Marc G.的看法——数据集很烂,尤其是在WCF方案中(它们增加了大量处理内存数据操作的开销)——不要使用它们。对于初学者和小规模的两层桌面应用程序来说,它们还可以,但我不会在严肃的专业应用程序中使用它们。

基本上,你的问题归结为如何将数据库中的行转换为可以通过WCF进行远程传输的东西。这意味着需要某种形式的映射——要么自己完成,使用DataReader,然后将所有数据塞入WCF的[DataContract]类中——你当然可以这样做,它能够给你终极控制,但是它也很繁琐、笨重且容易出错。

或者你可以让一些现成的ORM为你处理这些单调乏味的工作——在 Linq-to-SQL (非常好,易于使用,灵活,但仅支持SQL Server)、EF v4(计划于2010年3月发布,看起来非常有前途,非常灵活)或其他任何ORM中选择最适合你需求的。

ORM领域的其他严肃竞争对手可能包括Subsonic 3.0和NHibernate(还有许多其他的)。

因此,总结一下:

  • 忘记数据集
  • 要么自己完全控制并完成SQL和对象之间的映射
  • 让某个能力强大的ORM来处理它(Linq-to-SQL、EF v4、Subsonic、NHibernate等等),哪一个并不太重要,也是个人喜好和编码风格的问题


4
我不赞成使用数据集,特别是在像WCF这样的SOA环境中 - 它可以工作,但大多数情况下是错误的原因。它们根本不可移植,在我看来也不能真正跨服务边界工作。当然,在大多数其他情况下,它们也不起作用 ;-p 那么问题就转化为你想做多少个管道。大多数ORM将为您创建WCF可序列化类型; 个人而言,我现在会使用LINQ-to-SQL; 它比EF更简单,更完整,尽管EF 4.0比3.5sp1中的EF要好得多。您可以使用自定义TSQL(通过ExecuteQuery,它仍会将映射回对象),但我倾向于使用SPROC(用于复杂查询)或LINQ生成的查询(用于简单请求)。
自己编写类型也可以,与NHibernate等一起使用也可以。选项如此之多。

2
虽然EF与WCF协作非常有前途,但您应该考虑学习它所需的努力。特别是在做一些非常规的事情时,VS2008中的设计师无法再打开模型,您必须用XML编写模型。
此外,请记住,EF在非常高的抽象层级上工作。由于泄漏抽象原则,它并不像它应该的那样闪亮 :)
反过来说,这意味着当出现故障/性能问题时,您必须处理非常疯狂且难以阅读的SQL语句发送到数据库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接