综合应用WPF/WCF/WF/LINQ之二十八:代码生成器之DBMLToInfo

自动生成Info类的另外一个重要的原因在于,在一般的情况下,这些Info类没有可能一次就完全确定下来而不再修改,有了这个工具后,如果数据库结构有修改,则不必手工去更改代码,只需要重新运行一个Info类的代码生成器即可。
  为了让Info类适合一些逻辑要求,本Info类代码生成器需要手工进行一些必要的配置。如:一个Table中有DepartmentId字段,在一般情况下也需要将DepartmentName加到Info类中;一个Table有详细记录列表,则一般情况下也应该在该Info类中加一个IList类型的容纳记录列表的字段等。
  这些配置有些情况下是无法用代码自动完成的,所以必须手工配置。不过好在配置也并不复杂,而且一旦配置,后续就可以重复使用。其配置举例如下:
    1  <? xml   version =" 1.0"   encoding =" utf-8"  ?>
    2  < root >
    3      < tables >
    4          < item   name =" Department" >
    5              < associations >
    6                  < item   name =" Departments"   from =" Department"   alias =" parent"   source =" DepartmentParent"   nullable =" true"   delete =" true"  />
    7              </ associations >
    8          </ item >
    9          < item   name =" Employee" >
   10              < additions >
   11                  < item   name =" DepartmentName"   from =" Department"   source =" DepartmentId"   target =" DepartmentId"  />
   12                  < item   name =" PositionName"   from =" Position"   source =" PositionId"   target =" PositionId"  />
   13                  < item   name =" EmployeeName"   alias =" ManagerName"   table =" Manager"   from =" Employee"   source =" EmployeeManager"   target =" EmployeeId"  />
   14              </ additions >
   15          </ item >
   16      </ tables >
   17      < removes >
   18          < item   name =" Table"  />
   19      </ removes >
   20  </ root >
  对于该Table已经存在的字段来说,则不用进行任何配置,我们需要配置的,只是一些“异常”的字段。如附加字段(置于additions标识下)、关联记录(置于associations标识下)等。
  下面列举出主体部分的代码。其中处理较麻烦的部分在于有些字段可以为空,因此需要采用Nullable<>这样的范型类型。
    1      for ( int i = 0; i < columns.Count; i++)
    2     {
    3         strContentes = strContentes +  "        [DataMember]" +  "\n";
    4 
    5          if (islinqs[i].ToString() ==  "True")
    6         {
    7             strContentes +=  string.Format( "        [Column(Storage = \"_{0}\", DbType = \"{1}\", CanBeNull = {2})]" +  "\n", columns[i].ToString(), dbtypes[i].ToString(), canbenulls[i].ToString());
    8         }
    9 
   10          if (canbenulls[i] !=  null && canbenulls[i].ToString() ==  "true" && types[i].ToString() !=  "String")
   11         {
   12             strContentes +=  string.Format( "        public Nullable<{0}> {1}" +  "\n", types[i].ToString(), columns[i].ToString());
   13         }
   14          else
   15         {
   16             strContentes +=  string.Format( "        public {0} {1}" +  "\n", types[i].ToString(), columns[i].ToString());
   17         }
   18 
   19         strContentes = strContentes +  "        {" +  "\n";
   20         strContentes +=  string.Format( "            get {{ return this._{0}; }}" +  "\n", columns[i].ToString());
   21         strContentes +=  string.Format( "            set {{ this._{0} = value; }}" +  "\n", columns[i].ToString());
   22         strContentes = strContentes +  "        }" +  "\n";
   23 
   24          if (i != columns.Count - 1)
   25         {
   26             strContentes = strContentes +  "        " +  "\n";
   27         }
   28     }
  至于XML的解析,可以采用反序列化的方法,直接一下子就把整个XML转化为类,这比起一步一步的解析XML来说,要容易得多了,具体请参考源代码。




本文转自 Eallies 51CTO博客,原文链接:http://blog.51cto.com/eallies/79012,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值