zoukankan      html  css  js  c++  java
  • 【实体类变形】—— 元数据(另类ORM) 描述字段的数据

     

         放假了,不知道有没有加班的,先祝大家国庆节快乐!

         上次说得有点乱,“行列转换”这个词可能误导了大家,那么把这个词扔掉吧。我们重新开始。假设我们有一个News表,我们要往里面添加数据,我们先只考虑保存数据的部分。

    一、我们定义一个类。变形的“实体类”

     public class ColumnsInfoBase       
        {
            
    #region 字段的基本信息的描述
            
    /// <summary>
            
    /// 配置信息里面的字段的标识
            
    /// </summary>
            public int ColumnID = 0;

            
    /// <summary>
            
    /// 数据库里的字段名称
            
    /// </summary>
            public string ColSysName = "";

            
    /// <summary>
            
    /// 显示给客户看的名称
            
    /// </summary>
            public string ColName = "";

            
    /// <summary>
            
    /// 字段类型,int nvarchar 等
            
    /// </summary>
            public string ColType = "";

            
    /// <summary>
            
    /// 字段大小
            
    /// </summary>
            public Int32 ColSize = 0;

            
    /// <summary>
            
    /// 字段值
            
    /// </summary>
            public string ColValue;
       
            
    #endregion

        }

     

    二、XML文件,表结构。新闻表里面有一个新闻名称的字段(Title),nvarchar(50)的;有一个新闻内容的字段等, 那么我们可以这样来设置这样一个XML文件,来对字段进行描述。

    XML文件,说明字段

     

    三、加载。然后我们可以写一个这样的代码来加载“实体类”

    Dictionary<int, ColumnsInfoForm> dic_BaseCols = new Dictionary<int, ColumnsInfoForm>();

                ColumnsInfoForm info;

                info 
    = new ColumnsInfoForm();

                
    //属性值要从XML文件里面获取,这里为了简洁直接赋值了。
                info.ColumnID = 101;        //从XML文件里面获取
                info.ColSysName = "Title";       //从XML文件里面获取
                info.ColName = "新闻标题";       //从XML文件里面获取
                info.ColType = "nvarchar";       //从XML文件里面获取
                info.ColSize = "50";       //从XML文件里面获取

                dic_BaseCols.Add(info.ColumnID, info);


         四、动态得到SQL语句。现在我们要实现添加数据的功能,不对要叫做“持久化”了,我们可以这样来拼接SQL语句。

    Code

         我们还需要存储过程的参数

    得到存储过程的参数

         这样我们就可以得到存储过程的参数了。

         有了参数化的SQL语句(insert into)还有存储过程的参数,那么下面就好办了。我们可以交给SQLHelp、DbHelp、自己写的Help或者直接写SqlCommand。总之怎么做都可以了。用我的数据访问函数库也可以。

         这个可以扩展一下,不仅是新闻表可以使用,其他的表也是可以使用的,只要设置不同的XML文件就可以了。
     

    ORM另类ORM的区别

         1、ORM类和表的对应,一个类可以和一个表或者多个表对应,一个表也可以和一个类或者多个类对应。类的属性(表的字段)不能独立存在,也不能被拆分;

         而另类ORM类和字段的对应。类的属性是对字段的描述信息,类——也就是字段——是可以随意组合的。就是说是可以以字段为最小单位进行灵活组合。这样就可以大大提高效率,延迟加载也就用不上了,比延迟加载更灵活和可控制!

         2、一般的实体类是把字段作为属性来处理的(为了少写代码,就需要使用反射),这样字段变化了就需要修改实体类,这就带来了很多的修改。     

         而另类实体类是把字段信息作为属性值来处理的,这样字段变化了只需要属性值就可以了,而属性值又是由XML文件里面提取的,所以只需要修改XML文件就可以了,不用修改实体类。不修改实体类,与之相关的很多地方都不用修改代码了。这样当字段变化,基本上只改一条配置信息就可以了

         3、一般的实体类携带的信息有限,只有字段名和字段值,而要获取字段名还需要一个“潜规则”那就是要用字段名来命名属性名,然后再用反射的方式来获得,兜了一个大圈子。至于字段类型和字段大小就没有地方放了。

         而另类的实体类采用属性值的方式来存放各种信息,这样可以用增加属性的方式来存放更多的信息,比如ColumnsInfoBase  类里面的属性就可以分别存放字段名称、字段类型、字段大小和字段值。 这样想放什么类型的信息都可以。用的时候只需要提取属性值就可以了,不用反射。

    另类ORM的优点:


         1、项目再大,添加数据(持久化)只需要这几个函数加上一个help就可以了,代码和文件都不会增加,只需要增加xml文件就可以了。

         2、数据层大大瘦身,变成了固定的几个函数 + Help 的形式,这样其他的项目也可以共用,大大节省了开发时间,这样才可以真正的不用思考如何持久化,把大部分的精力都放在业务逻辑的处理上!

         3、字段变化了也不用修改代码(不仅是数据层的,UI层也是不用修改的,如果业务逻辑简单,那么逻辑层也是不用修改的,只有在很复杂的业务逻辑的情况下,才有可能需要就改逻辑层,不过这个修改的原因不是因为字段变化了,而是业务逻辑变化了,还有要注意的是,即使是业务逻辑变了,其它层也是不需要修改的),只需要修改xml文件即可。这个是针对三层的最大的缺点来优化的!效果很好

         3、文件、代码减少了之后会带来很多的方便。比如编译时间,一、两秒就可以完成。备份文件的时间也大大减少。要写的代码少了,工作量自然也就减少了。不用代码生成器也可以很方便。

  • 相关阅读:
    去年课程设计的作品
    终于结束了期末考试
    记在园子里安家
    ASP.NET中实现无刷新级联
    ASP.NET中利用JQuery AJAX修改用户密码
    The LogStructured MergeTree(译)(转载)
    我常用的Latex中文报告模板(一)
    LRU算法的简单实现( C语言 + uthash包)
    epoll 使用详解
    转载系列之一:浅析Hadoop文件格式
  • 原文地址:https://www.cnblogs.com/jyk/p/1302239.html
Copyright © 2011-2022 走看看