我需要为N层应用程序仔细选择.NET ORM.这意味着,我将拥有公开数据的服务器(WCF服务)和显示它的客户端.ORM应该平滑地支持所有相关的序列化问题 - 对象或对象集合,或者必须跨越进程边界的任何事物.理想情况下,多进程环境中的用法应与单个进程中的用法相同.
标准是:
Jef*_*eff 10
使用以下内容:
NHibernate的
LLBLGEN
实体框架
LINQ to SQL
DataObjects.Net
的OpenAccess
数据表
我当然可以说DataTables更优越......不仅仅是开玩笑.所有这些都有自己的优点和缺点.
主要是,我发现这些优势和wekanesses与ORM的一般类型有关,它分为以下两类
重量级
LLBLGen,OpenAccess,Entity Framework(4.0之前版本),DataObjects都属于这一类.重量级ORM通常具有从特定于ORM的基类(即EntityBase)继承的实体和集合.这些ORM通常提供丰富的设计时支持,代码生成和深度运行时功能(例如状态跟踪,事务跟踪,关联维护等).
Pro:利用内置API在运行时与实体本身进行交互(即来自LLBLGen entity.Fields ["MyField"] .IsChanged或entity.IsNew或entity.Fields ["MyField"] .DbValue
骗局:沉重和依赖.使用这些ORM,您的业务对象现在可以直接绑定到ORM API.如果您想要更改为其他ORM怎么办?什么是防止初级开发人员滥用ORM API的高级功能来修复复杂解决方案的简单问题(我已经看到了这一点)?内存使用也是这些ORM的一个大问题.5000多个实体的集合可以轻松地使用上述ORM中的100MB RAM.序列化是另一个问题.随着对象的沉重,序列化可能会非常慢......并且它可能无法正确地在线路的另一端进行反序列化(WCF或.NET远程处理等).关联最终可能无法正确关联,或者某些字段可能无法保留.
重量轻
LINQ to SQL,Entity Framework POCO,NHibernate(有点)属于这个类别.轻量级ORM通常使用POCO,您可以在VS中的文件中自行设计(当然,您也可以使用T4模板或代码生成器).
专业:轻量级.保持简单.ORM不可知的业务对象.
Con:较少的功能,例如实体图形维护,状态跟踪等.
无论您选择什么样的ORM,我个人的偏好都是坚持LINQ和ORM独立检索语法(不是ORM自己的API提取,如果有的话).
关于提到的具体问题,以下是我的简短想法: - NHibernate:时代背后的技术明智.大量的xml映射文件的维护(虽然Fluent NHibernate确实缓解了这一点).
LLBLGen:我与之合作过的最成熟的ORM.轻松启动新项目并开始工作.最佳设计师.非常重的.丰富的非常强大的API.我遇到过的最佳速度.因为它不是块中的新手,所以利用新技术的一些新功能并没有得到应有的实现(LINQ专门).
实体框架:4.0中的POCO类看起来很有前途.3.5没有这个,我甚至不会考虑它.即使在4.0中,也没有很好的LINQ支持并且生成不良的SQL(可以为单个LINQ查询生成数百个数据库查询).对于大型项目,设计师支持很差.
LINQ to SQL:很棒的LINQ支持(比DataObjects.Net除外).平庸持久性(保存/更新)支持.非常轻便(POCO).设计器支持很差(没有从DB刷新).高级LINQ查询性能不佳(可以进行数百次数据库查询)
DataObjects.Net:非常棒的LINQ支持和性能.提供我在重量级ORM中看到POCO最接近的东西.真正新颖,强大,有前途的技术.非常灵活.
OpenAccess:没有使用过它,但它让我想起了LLBLGen,但并不像功能丰富或成熟.
DataTables:没有评论
我推荐Entity Framework v4.自v1以来,它已经有了很大的改进,除了开源之外,还支持你需要的一切: