.NET进阶——浅谈ORM的映射方案

5 篇文章 0 订阅

  结合上文,在对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映射实现才算完成。


评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值