关于ORM的一点思考

1、为什么使用ORM
   1)无SQL

   i.  为了证明SQL的正确性,也许我们要把SQL语句粘贴到数据库中,运行一下——当然,经历过一段时间的SQL磨练之后,肉眼能看出大多数SQL中的错误

   ii. 各个数据库,还不完全一样


   2)业务是变化的

   i.  同一个程序,也许随着时间的变化,业务也在发生着变化。以前用到的,现在不用了;现在在用的,以前没发现。

   ii. 这个软件在A公司做了,到B公司,哎,不错,给我们也做一个吧,主要就是把这个地方、这个地方和这个地方改改,应该很简单吧——旁边插不上话的程序员,在心里恨着:“说得简单!”——如果你觉得简单,说明你还没经历过,看起来几个字段的增减,却可能在N个地方都会出现问题——你会觉得这设计做得太差了吧,但实际上大多数软件,就是这么高度的耦合着

  

    3)最根本的:我添加一个字段,我不希望界面、逻辑、数据库都要仔细查找一遍——我希望能够知道,只有一个或者几个确定的地方会需要改动,怎么改动——程序员怕什么?怕自信满满的告诉项目经理,某某问题改好了。一提交测试,却告诉你,更多问题出现。

2、我们需要实体吗?

    答案是未必!如果一张表里的信息,我们只是简单的存储、展现一下,需要通过实体取值、赋值做什么?

    数据库的数据,是一种值键关系,展现在我们页面上的表单,也是一种值键关系。如果我们中间加一个实体转换,我们不得不:

        //从数据库取数据

        A.A1 = db.Get("A1");//或许你还需要强制转换一下

        A.A2 = db.Get("A2");

        //展示数据

        控件A1.Text = A.A1;//或许你还需要.ToString()

        控件A2.Text = A.A2;

    但如果直接是:

        FindControl("控件A1").Text = db.Get("A1");

    这时则有可能批量对控件进行赋值

        foreach(列 in db)

        {

             FindControl(列).Text = db.Get(列);

        }

    这个时候,加入一个实体类,对程序反而是让操作变得烦琐——如果字段上百,你就知道,原来混点工资这么简单,在visual studio不停的敲"."就可以。

    (代码生成工具?嗯,是可以的——但是在做代码生成工具之前,我希望你先把代码写得更优雅点)

3、计算机关心什么?

    从上面的例子我们知道, 计算机才不关心你是用实体还是其它呢,计算机关心的是正确的、全面的信息。

    所以,如果你写了个100多个属性的实体类,但这其中99个都只是赋值、取值操作(不需要根据该值做任何判断),那你用一个Hashtable,给计算机也是一样的——一个属性,取代了100个属性

3、我们不需要实体吗?

    if(db.Get("A1")==1) DoSth1();

    else if(db.Get("A1")==2) DoSth2();

    每当写下这样的代码的时候,我的内心都感到忐忑不安,我害怕以下几件事发生:

    1) 某天,一个维护人员看到 "A1" 这个字段名不爽,三下五去二,就把名字给换掉了

    2) 某天,客户打来电话说,直接在数据库中,把A1的状态改为2吧,我生怕 db.Get("A1")==1时,有些事情没做,结果数据库中改成状态2,做不下去

    3) 某天,程序的后期维护人员打电话找到我,弱弱的问:那个1、2分别代表什么意思。我问:什么1、2?让我看看。结果看了半天,自己也没看懂。

    ...

    最怕的是有一天,经理走过来说,把这个程序“稍微”改改。

    所以,我们还是需要实体定义,写出的代码,还是要给人看的——从事编码几年之后,才知道,一个程序员主要时间还是在修改原来的代码,而不是全新的创作。

   

4、写代码的人,究竟关心什么?

     所以,我们知道,做为给人看的代码,并不需要把实体的每个属性逐一进行赋值、取值。

     写代码的人,关心的是,哪些字段需要进行业务上的判断。

     而对于这些需要判断的字段,我希望不会随便更改。

     如果必要要更改,我也希望能在更改的时候,编译器就能告诉我哪些地方使用了这个。

    

5、如何平衡?

     办法应该不是唯一的。

     我想到的一个简易的办法就是所有实体继承自一个基类,大概是这样

          public class EntityBase

          {

                  Dictionary<string, object> values = new Dictionary<string, object>();

                  public object this[string name]{get{return values[name];}set{values[name]=value;}}                 

          }

          而具体的实体,可能是这样子

          public class Student:EntityBase

          {

                 public DateTime Birthday{get{return (DateTime)this["Birthday"];} set{this["Birthday"] = value;}}

          }

          而使用可能是这样子的

          Student stu = db.GetEntity<Student>();

          if(stu.Birthday.Day == DateTime.Now.Day) {Show("今天是您的生日");}

  

原文地址:https://www.cnblogs.com/binblog/p/1945455.html