.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映射实现才算完成。


0 0