我在这里真的很难过。我需要设计一个“桌面应用程序”,它将使用WCF作为通信渠道。它是一个多层应用程序(数据库和应用程序服务器是相同的,客户端通过互联网云)。
应用程序有点复杂(就SQL和代码逻辑而言)比通常的LOB应用程序,但概念是相同的:从DB读取,更新到DB,处理并发等等。我的问题是现在与实体框架公开,我无法决定采用哪种方式:我应该使用实体框架,数据集还是自定义类。
正如我在Entity Framework中所理解的那样,它还将创建我的数据库表ALONG与CRUD脚本的对象映射。这对于简单的CRUD来说一切都很好,但是大多数时候“选择”很复杂,它需要一个自定义SQL。我知道我可以在EF中使用存储过程(我不喜欢SP btw,我不知道为什么,我喜欢手动在DAL中编写我的SQL代码,我感觉更加安全和舒适)。
使用DataSet,我将使用自定义SQL并填充数据集。使用自定义类(数据库表的对象),我将在自定义类(集合和列表等)上填充自定义SQL。我想使用EF,但我没有信心部署一个我没有编写但在代码中看不到的SQL的应用程序。我在这里错过了什么。
非常感谢这方面的任何帮助。
Xeshu
答案 0 :(得分:12)
我同意Marc G. 100% - DataSets很糟糕,特别是在WCF场景中(它们为处理内存数据操作增加了很多开销) - 不要使用它们。它们对于初学者和小规模的双层桌面应用程序也没有好处 - 但是我不会在一个认真,专业的应用程序中使用它们。
基本上,您的问题归结为如何将数据库中的行转换为可以通过WCF远程转换的内容。这意味着某种形式的映射 - 要么你自己做,使用DataReaders,然后将所有数据推送到WCF [DataContract]
类 - 你当然可以做到这一点,给你最终的控制,但它也很乏味,繁琐,容易出错。
或者你让一些现成的ORM为你处理这个笨拙的工作 - 选择Linq-to-SQL(优秀,易用,灵活,但仅限SQL Server),EF v4(3月份之前) 2010年 - 看起来非常有前途,非常灵活)或任何其他ORM,真的 - 最适合您的需求。
ORM领域的其他重要竞争对手可能包括Subsonic 3.0和NHibernate(以及许多其他竞争对手)。
总结一下:
答案 1 :(得分:4)
我不能提倡数据集,特别是在像WCF这样的SOA环境中 - 它可以工作,但主要是出于错误的原因。它们根本不是便携式的,IMO并没有真正“服务”超过服务边界。当然,IMO在大多数其他场景中也不起作用;-p
那么它归结为你想要做多少管道工程。大多数ORM将为您创建WCF可序列化类型; 个人我目前正在使用LINQ-to-SQL;虽然EF 4.0在3.5sp1中要比EF好得多,但它比EF更简单,更完整。您可以使用自定义TSQL(通过ExecuteQuery
,它仍然将映射返回到对象),但我倾向于使用SPROC(用于复杂查询)或LINQ生成的查询(用于简单请求)。
自己编写类型也很好,并且可以使用NHibernate等。这么多选项。
答案 2 :(得分:2)
虽然EF与WCF配合使用并且听起来非常有前途,但你应该考虑加快速度。特别是当做一些非常重要的事情时,VS2008中的设计师不能再打开模型了,你必须用xml编写你的模型。
另请注意,EF在非常高的抽象级别上工作。因为law of leaky abstractions它不是那么闪亮,因为它应该是:) 反过来说,这意味着,当涉及到故障排除/性能问题时,您必须处理发送到数据库的非常疯狂且难以读取的sql语句。