.NET进阶——浅谈ORM的映射方案
来源:互联网 发布:淘宝网的微淘在哪里 编辑:程序博客网 时间:2024/05/11 14:35
结合上文,在对ORM的结构实现简单进行描述:
首先ORM对数据访问层的增删改查方法进行抽象,变化的东西只是不同的实体参数(而泛型是很容易解决),而底层的这些增删改查方法的sql语句不再是select * from User where userId=@userId这样,因为这样是完全无法复用的,而是通过将表名User和字段名userId抽出来,用实体名和属性(实体作为参数传进来的)去获得或反射得到数据库表名和字段名,然后对sql语句进行拼接。如何将实体和表进行映射,这是实现ORM的关键。
对于ORM的映射方案,目前了解到的有两种比较常用的方案:
方案一
基于XML与实体实现的映射,例如Nhibernate
XML中定义了所要映射的实体和要映射的表,在生成sql语句时,只需要对相应的XML进行解析,取得对应的表名及字段名即可。
以Nhibernate为例:
<?xmlversion="1.0" encoding="utf-8" ?><hibernate-mappingxmlns="urn:nhibernate-mapping-2.2"> <class name="Entity.UsersEntity, Entity" table="T_users" lazy="false"> <id name="Id"column="Id" type="String(20)"> <generator class="assigned"/> </id> <property name="Name"column="Name" type="String(40)"/> <property name="Password" column="Password" type="String(20)"/> </class></hibernate-mapping>实体代码和以前一样,略了。
通过XML进行映射的好处:
1、方便开发,XML和实体可以相互转化。
2、XML的通用性,不同数据库的差异对XML映射文件的影响很小。
3、在生成SQL语句的时候,不要每次都反射实体类,只需要从XML读取即可,提高效率。
方案二
基于实体加Attribute(特性)实现的映射,例如微软的Entity Framework。
Attribute我们还是比较陌生的,先看看他到底是什么:
publicclass UserEntity{ [Required(ErrorMessage = "*用户名不能为空")] public string id{ get; set; }}
说明:
只要界面id输入框绑定了实体id属性,即在输入时可验证是否输入为空。(Required即使一个Attribute类,是.NET类库提供的,Attribute类继承自System.Attribute)
Attribute如是说:它是对运行时的对象或对象的属性、方法、委托等进行描述的类。
当然我们ORM中如何使用Attribute呢?下面我们通过自定义Attribute类和实体来介绍如何实现ORM映射。
实例:
自定义的Attribute类,用于描述数据库表及字段:
public classDataFieldAttribute : Attribute { public DataFieldAttribute(stringfieldName,string fieldType) { this._fieldName = fieldName; this._fieldType = fieldType; } //字段名 private string _fieldName; public string FieldName { get { return _fieldName; } set { _fieldName = value; } } //字段类型 private string _fieldType; public string FieldType { get { return _fieldType; } set { _fieldType = value; } } }
说明:
通过自定义Attribute,定义了类属性和数据库字段的一一对应关系,而在实体类中的属性都加上Attribute的描述,指定他们对应的数据库字段名以及类型即可。
实体类
publicclass UserEntity { private string _id; //使用“特性”描述对应的数据库字段名、类型 [DataFieldAttribute("ID", "varchar")] public string ID { get { return _id; } set { _id = value; } } private string _password; [DataFieldAttribute("Password", "string")] public string Password { get { return _password; } set { _password= value; } } }
通过Attribute实现的优点
通过Attribute一个实体类,对应数据库中的一张表,查看很方便,也有利于维护,还可以添加验证。
总结
要实现ORM的映射方案不仅仅这两种,但是这两种却是对ORM很好的实现,也分别对应这Nhibernate及EF两大ORM框架的实现理念。当然如何去选择适合的,需要更充分的调研及实际应用了。
映射完了,接下来就是如何解析出XML或者通过Attribute反射实体进行SQL语句拼装,这样简单的ORM映射实现才算完成。
- .NET进阶——浅谈ORM的映射方案
- .NET进阶——ORM基础认识
- ORM映射方案---EF CodeFirst
- ORM映射方案---EF实体框架的安装。
- Dapper ORM 用法—Net下无敌的ORM
- Dapper ORM 用法—Net下无敌的ORM - Yowe
- Dapper ORM 用法—Net下无敌的ORM
- .NET ORM 映射解析 【收藏】
- ORM进阶之Hibernate中关系映射
- ORM进阶之Hibernate中关系映射
- hibernate的ORM映射
- 浅谈ORM对象关系数据库映射
- ORM进阶:映射文件编写(上)-基本映射
- ORM进阶:映射文件编写(下)-继承映射
- hibernate ORM映射——单表映射
- ORM进阶之Hibernate中多对一的映射关系
- MyBatis进阶(一)—映射
- Dapper ORM 用法—Net下无敌的ORM(转)
- Linux内核的Oops
- iOS用户引导页的简单实现
- UVA 11504 - Dominos(强连通分量)
- 沿途风景
- 2014年暑假总结——在困难中成长
- .NET进阶——浅谈ORM的映射方案
- 工作生活——思考
- 二叉树的简介
- 告诉我图样图森破的两道简单C++笔试题
- 分块仿射变换
- linux配置ssh使用证书免输入密码登陆服务器
- 一大波待整理的思绪
- 范德萨发的说法萨顶顶
- http://travel.tianya.cn/travelPlan/showPlan?planId=2981692