或许EES 与 NH 根本就没有可比性,一个是业界久负盛名,一个是发育不良的幼儿

从老赵的BLOG里面和其他的地方了解到了一些NHibernate的处理方式,也没有深入去学习,当然,不是不想去学习,只是时间不允许去深入学习,首先要填饱肚子嘛。

关于EES的ORM,代码组织上面已经介绍过了,处理过程和很多细节方面没有作介绍, 结合老赵的点评,把自己的EES ORM 部分介绍大致的介绍一下。

EES的ORM,数据模型采用的也是贫血型的领域。

典型代码
public class Order
{string custCode;public virtual string CustCode{get{retrun custCode;} set{custCode=value;} 
    }Customer customer;public virtual Customer Customer{get{retrun customer;}set{customer=value;}}DataCollection<OrderDTL> itemCollection;public virtual DataCollection<OrderDTL> ItemCollection{get{retun itemCollection;}set{itemCollction=value;}}
}

1、对于延迟加载的处理:老赵关于延迟的原文

延迟加载所用的机制与赵介绍的类似,不过,用的不是Func<>类似的处理方式,而是直接用IL写的。根据配置文件和一些条件动态生成代理类,如果需要延迟加载的,则生成延迟加载相关逻辑。如果延迟加载的,则代理类的示意代码如下:

public class DOrder : Order
{bool __custCode;public override string TagNames{get{if(!__custCode){__custCode=true;base.TagNames = "……加载部分逻辑";}return base.TagNames;}set{__custCode=true;base.TagNames = value;}}
}
      D,代表是动态类,每个动态类都是在原来类的前面加上D
      在生成延迟加载逻辑的同时,根据配置文件,还生成了校验逻辑,以后面的Interceptor的处理里面,再作介绍。 
 
   2、对virtual的处理:老赵的关于Virtual处理的原文 
      对于virtual的处理,与NH,有稍微的不同:在EES里面(老赵可以不用抱怨了,哈哈),与数据库映射的类,其实不仅仅是与数据库映射类,用还是不用virtual,是需要考虑的。
      默认状态下工具生成的代码,public 的属性都是 有virtual 的。对于同步加载的字段和不需要校验的属性,可以去掉 virtual;反过来,如果是需要校验的,则必须加上。并且在使用的时候,需要注意使用属性,而不是字段,这一点,给编码过程中引入了一个出BUG的机率。
      在数据类方面,virtual 除了上面常用的这两点,还有一个重要的一点:自动维护双向关系,如果不加virtual,则系统无法自动维护双向关系,也无法实现双向绑定和级联触发。
 

3、对集合的处理:老赵的关于自定义集合

关于自定义集合,真的很遗憾,EES 不支持自定义集合,特别是在数据加载的时候。

对于双向关系维护,框架是提供了。都在后台处理,从编码上看,通常不需要单独处理,与老赵的处理方式有一点点的差异。上面已经提过,必须要求 在属性前添加 virtual 。

    DataCollection<OrderDTL> itemCollection;public virtual DataCollection<OrderDTL> ItemCollection{get{retun itemCollection;}set{itemCollction=value;}}

对于映射类和其他普通数据类,框架要求尽可能的从 EESObject 继承,对于集合类,尽可能的用 DataCollection 这个类。

这两个类都实现了同一个接口:ICascade

     public interface ICascade{object Parent { get; set; }}
    通过此接口实现数据的回溯。一个对象的父类,要么是一个集合要么是一个对象,有且只有一个父级。
    在使用的时候可以通过强制转换来应用。在访问的时候,会在get里面会给Parent赋值。在生成动态类的时候,会根据public 和 virtual 以及 ICacscade 进行逻辑生成。
 

4、对于Interceptor的处理:老赵的关于Interceptor的处理

Interceptor 在EES框架里面,处于非常非常重要位置。但是在处理机制上面,与NH的距离还是不小的。介绍一下自己的处理方式,也希望大家能给出批评和建议。

在EES里,Interceptor主要提供了 前/后/包围 三种方式,主要应用在属性和函数上面,对于静态函数暂时不支持。使用要求与上面提到的一样,要求必须是public 并且添加 virtual 的。

对于属性的应用主要是 校验和延迟加载;对于函数的应用主要是事务/日志或其他的应用,可以自行扩展。

在EES 的BLL里面,或EES 提供的数据库相关逻辑里面,提供了一点常用的其他操作和处理过程。这一点,与框架的处理思想直接相关,每个人的想法都有所差异。

在BLService里,提供了类似于老赵的这一篇回复里处理机制,但他不是Interceptor,作用类似。

    public class BLService<T> : IBLService<T>, ICloneable where T : global::EES.Common.Data.EESObject{public BLService();protected IContext EESContext { get; }[Operation(ScopeOption.Required)]public virtual T Add(T t);[Operation(ScopeOption.Required)]public virtual DataCollection<T> AddAll(DataCollection<T> collection);[Operation(ScopeOption.Required)]protected virtual DataCollection<T> AddAllCore(DataCollection<T> collection, object state);[Operation(ScopeOption.Required)]protected virtual T AddCore(T t, object state);public object Clone();[Operation(ScopeOption.Disabled)]public virtual int Count(params IClause[] clauses);[Operation(ScopeOption.Required)]public virtual T Delete(T t);[Operation(ScopeOption.Required)]public virtual DataCollection<T> DeleteAll(DataCollection<T> collection);[Operation(ScopeOption.Required)]protected virtual DataCollection<T> DeleteAllCore(DataCollection<T> collection, object state);[Operation(ScopeOption.Required)]protected virtual T DeleteCore(T t, object state);[Operation(ScopeOption.Required)]protected virtual object Execute(string commandText);[Operation(ScopeOption.Required)]protected virtual object Execute(string commandText, params KeyValuePair<string, object>[] parameters);[Operation(ScopeOption.Disabled)]public virtual DataCollection<T> Find(params IClause[] clauses);[Operation(ScopeOption.Disabled)]protected virtual DataCollection<D> FindCore<D>(params IClause[] clauses) where D : EESObject;[Operation(ScopeOption.Disabled)]protected virtual T FindId(params object[] primaryKeys);[Operation(ScopeOption.Disabled)]public virtual DataCollection<T> FindPage(int currentPage, int pageSize, params IClause[] clauses);[Operation(ScopeOption.Disabled)]protected virtual T FindPair(params KeyValuePair<string, object>[] properties);[Operation(ScopeOption.Disabled)]public object LoadProperty(EESObject obj, string propertyName);protected virtual void OnAdded(T t, object state);protected virtual void OnAdding(T t, object state);protected virtual void OnDeleted(T t, object state);protected virtual void OnDeleting(T t, object state);protected virtual void OnSaved(T t, object state);protected virtual void OnSaving(T t, object state);protected virtual void OnUpdated(T t, object state);protected virtual void OnUpdating(T t, object state);[Operation(ScopeOption.Required)]public virtual T Save(T t);[Operation(ScopeOption.Required)]public virtual DataCollection<T> SaveAll(DataCollection<T> collection);[Operation(ScopeOption.Required)]protected virtual DataCollection<T> SaveAllCore(DataCollection<T> collection, object state);[Operation(ScopeOption.Required)]protected virtual T SaveCore(T t, object state);[Operation(ScopeOption.Required)]public virtual T Update(T t);[Operation(ScopeOption.Required)]protected virtual T UpdateCore(T t, object state);}

没有别的,又是一大堆 virtual,我自己都有点无语了,不过这里的virtual 不是为了生成动态类,而是为了在派生类里面重写。

        protected virtual void OnAdded(T t, object state);protected virtual void OnAdding(T t, object state);protected virtual void OnDeleted(T t, object state);protected virtual void OnDeleting(T t, object state);protected virtual void OnSaved(T t, object state);protected virtual void OnSaving(T t, object state);protected virtual void OnUpdated(T t, object state);protected virtual void OnUpdating(T t, object state);

这几个空函数,主要是为了在处理层次数据的时候使用。

对于上面的Order类,可以在保存完主订单后,再调用OrderDTLService 来保存 订单的明细,也可以在订单明细OnAdding里面,进行库存的核查。

关于与NH的对比,先写到这里,以后再慢慢的完善吧

还有很多与NH不相关的,但是属性框架一部分的内容,接下来,再介绍……

转载于:https://www.cnblogs.com/dreamstec/archive/2010/09/01/1814662.html

NHibernate OR EES ,不能比较的比较相关推荐

  1. Simple NHibernate Architecture[from]

    原文地址:http://www.codeproject.com/aspnet/NHibernateArchitecture.asp Download source - 2,523.7 KB Intro ...

  2. NHibernate从入门到精通系列(7)——多对一关联映射

    内容摘要 多对一关联映射概括 多对一关联映射插入和查询 多对一关联映配置介绍 一.多对一关联映射概括 关联关系是实体类与实体类之间的结构关系,分别为"多对一"."一对一& ...

  3. NHibernate初学体验记

    NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库.NHibernate 来源于优秀的基于Java的关系型持久化工具Hibernate.NHibernate持久化你的.Net ...

  4. ActiveRecordBase借助NHibernate的条件获取实体类对象

    ActiveRecordBase.FindAll() 函数其中有一个这样的版本的参数 ActiveRecordBase.FindAll(TargetType As System.Type,Orders ...

  5. 未能从程序集 XX加载类型XXX的错误解决方法(借以提醒NHibernate使用者)

    这是写.hbm.xml文件最容易犯的错误之一 首先,Class的Name属性必须是"完全限定类名,程序集名" 这里,例如 <class name="ibiz.cor ...

  6. ORM武器:NHibernate(三)五个步骤+简单对象CRUD+HQL

    前面的两篇文章中.我们对NHibernate已经做了大致了解 <ORM利器:NHibernate(一)简单介绍>Nhibernate的作用:攻克了对象和数据库的转化问题 <ORM利器 ...

  7. [NHibernate]代码生成器的使用

    目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识,都是自己手敲的代码,有时候显得特别的麻烦,比如你必须编写持久化类,映射文件等等,举得例 ...

  8. NHibernate和Cuyahoga(二)(翻译):

    原文:http://www.cuyahoga-project.org/home/developers.aspx Mappings: 在我们使用像NHibernate这样强大的ORM工具的时候,映射类有 ...

  9. NHibernate之旅(11):探索多对多关系及其关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

最新文章

  1. ubuntu下zip文件操作
  2. python面试常见题目
  3. 关于mobile中datagrid的使用
  4. 15款的视频处理软件免费下载
  5. Python学习笔记_1_基础_2:数据运算、bytes数据类型、.pyc文件(什么鬼)
  6. mvc一对多模型表单的快速构建
  7. 通过yum下载rpm包
  8. Spring 4 Security MVC登录注销示例
  9. mysql实现不重复插入数据
  10. php把buffer转化为图片_干货:如何提升转化率?5个优化转化率的tips
  11. 201632位matlab下载_Matlab 2016a下载
  12. linux xshell 如何使用教程,Xshell入门教程
  13. 《MATLAB智能算法超级学习手册》一一1.5 简单工程应用分析
  14. html字体制作,用@font-face实现网页特殊字符(制作自定义字体)
  15. ThinkPHP学生作业管理系统
  16. 经典黑白搭配 现代简约风格设计美学精神
  17. win7桌面计算机丢失,windows7电脑系统文件丢失怎么办
  18. 问题解决:Invalid version number:Version number may be negative or greater than 255
  19. 数据结构和算法学习网站
  20. y空间下载_阿里云网盘来啦!大咖手把手教你如何搭建免费quot;5G极速下载”私人网盘...

热门文章

  1. .Net技术+智能信息直通车
  2. ftp服务器怎样删除文件夹,ftp服务器删除文件夹
  3. php代码隐写到图片,从PNG Dropper到Alpha通道隐写术实践
  4. 华为m30pro最近升级是鸿蒙吗,华为mate30pro升级鸿蒙系统
  5. snm算法_基于SNM算法的大数据量中文商品清洗方法
  6. 2020-06-12 开篇词
  7. MPR在旋转轴线时图像周围出现灰色边界的解决方法
  8. 【流式计算】twitter storm Rationale[1]
  9. 2018.9.1 初识FPGA --xilinx zynq为例
  10. U-Boot 之五 详解 U-Boot 及 SPL 的链接脚本、启动流程