自己写数据库访问ORM

目前,往上有很多优秀的ORM,但和Csla紧密结合还没找到合适的。出于需要,自己动手写了一个。主要优点在于,实现了直接通过DataReader填充业务类数据。IF使用简单,只要在业务类上标记特性TableClass、FieldDescription即可将业务类和数据库建立映射关系。

下面看一个例子:

现在有一个用户信息的表:E-R图如下:

 

要实现该表的数据库新增、修改、查询功能,需要实现下面两个业务类:

  1 using Csla;
  2 using IF.CslaCore;
  3 using IF.OrmCore.DataSchema;
  4 using System;
  5 using System.Collections.Generic;
  6 using System.ComponentModel;
  7 using System.Linq;
  8 using System.Text;
  9 using System.Threading.Tasks;
 10 
 11 namespace IF.SysUser.Business
 12 {
 13     [Serializable]
 14     [TableClass(FriendlyName="用户信息表",TableName="SYS_USER")]
 15     public class SysUser : IfBusiness<SysUser>
 16     {
 17         private static readonly PropertyInfo<string> SUR_IDProperty = RegisterProperty<string>(c => c.SUR_ID);
 18 
 19         [DisplayName("SUR_ID")]
 20         [FieldDescription(IsPrimaryKey=true,ColumnName="SUR_ID",FriendlyName="SUR_ID",NeedUpdate=true)]
 21         public string SUR_ID { get; set; }
 22 
 23         private static readonly PropertyInfo<string> UserNameProperty = RegisterProperty<string>(c => c.UserName);
 24         [DisplayName("登录名")]
 25         [FieldDescription(ColumnName="SUR_USERNAME",FriendlyName="登录名",NeedUpdate=true)]
 26         public string UserName { get; set; }
 27 
 28 
 29         private static readonly PropertyInfo<string> NameProperty = RegisterProperty<string>(c => c.Name);
 30         [DisplayName("姓名")]
 31         [FieldDescription(ColumnName="SUR_NAME",FriendlyName="姓名",NeedUpdate=true)]
 32         public string Name { get; set; }
 33 
 34         private static readonly PropertyInfo<string> PasswordProperty = RegisterProperty<string>(c => c.Password);
 35         [DisplayName("密码")]
 36         [FieldDescription(ColumnName="SUR_PASSWORD",FriendlyName="密码",NeedUpdate=true)]
 37         public string Password { get; set; }
 38 
 39         private static readonly PropertyInfo<string> LoginMacProperty = RegisterProperty<string>(c => c.LoginMac);
 40         [DisplayName("登录Mac地址")]
 41         [FieldDescription(ColumnName="SUR_LOGIN_MAC",FriendlyName="登录Mac地址",NeedUpdate=true)]
 42         public string LoginMac { get; set; }
 43 
 44         private static readonly PropertyInfo<string> LoginIPProperty = RegisterProperty<string>(c => c.LoginIP);
 45         [DisplayName("登录IP")]
 46         [FieldDescription(ColumnName="SUR_LOGIN_IP",FriendlyName="登录IP",NeedUpdate=true)]
 47         public string LoginIP { get; set; }
 48 
 49 
 50         private static readonly PropertyInfo<DateTime?> LoginTimeProperty = RegisterProperty<DateTime?>(c => c.LoginTime);
 51         [DisplayName("登录时间")]
 52         [FieldDescription(ColumnName="SUR_LOGIN_TIME",FriendlyName="登录时间",NeedUpdate=true)]
 53         public DateTime? LoginTime { get; set; }
 54 
 55         private static readonly PropertyInfo<DateTime?> LogoutTimeProperty = RegisterProperty<DateTime?>(c => c.LogoutTime);
 56         [DisplayName("登出时间")]
 57         [FieldDescription(ColumnName="SUR_LOGOUT_TIME",FriendlyName="登出时间",NeedUpdate=true)]
 58         public DateTime? LogoutTime { get; set; }
 59 
 60         private static readonly PropertyInfo<DateTime?> LoginFailTimeProperty = RegisterProperty<DateTime?>(c => c.LoginFailTime);
 61         [DisplayName("登录失败时间")]
 62         [FieldDescription(ColumnName="SUR_LOGIN_FAIL_TIME",FriendlyName="登录失败时间",NeedUpdate=true)]
 63         public DateTime? LoginFailTime { get; set; }
 64 
 65         private static readonly PropertyInfo<Int32?> LoginFailCountProperty = RegisterProperty<Int32?>(c => c.LoginFailCount);
 66         [DisplayName("登录失败次数")]
 67         [FieldDescription(ColumnName="SUR_LOGIN_FAIL_COUNT",FriendlyName="登录失败次数",NeedUpdate=true)]
 68         public Int32? LoginFailCount { get; set; }
 69 
 70 
 71         private static readonly PropertyInfo<bool?> LockFGProperty = RegisterProperty<bool?>(c => c.LockFG);
 72         [DisplayName("是否锁定")]
 73         [FieldDescription(ColumnName="SUR_LOCK_FG",FriendlyName="是否锁定",NeedUpdate=true)]
 74         public bool? LockFG { get; set; }
 75 
 76         private static readonly PropertyInfo<bool?> DisableFGProperty = RegisterProperty<bool?>(c => c.DisableFG);
 77         [DisplayName("是否有效")]
 78         [FieldDescription(ColumnName="SUR_DISABLE_FG",FriendlyName="是否有效",NeedUpdate=true)]
 79         public bool? DisableFG { get; set; }
 80 
 81 
 82         #region 通用字段
 83 
 84         private static readonly PropertyInfo<DateTime?> CreateTimeProperty = RegisterProperty<DateTime?>(c => c.CreateTime);
 85         [DisplayName("创建时间")]
 86         [FieldDescription(ColumnName="CreateTime",FriendlyName="创建时间",NeedUpdate=true)]
 87         public override DateTime? CreateTime { get; set; }
 88 
 89         private static readonly PropertyInfo<DateTime?> LastUpdateTimeProperty = RegisterProperty<DateTime?>(c => c.LastUpdateTime);
 90         [DisplayName("最后修改时间")]
 91         [FieldDescription(ColumnName="LastUpdateTime",FriendlyName="最后修改时间",NeedUpdate=true)]
 92         public override DateTime? LastUpdateTime { get; set; }
 93 
 94 
 95 
 96         public override void SetPrimaryKey(string key)
 97         {
 98             SUR_ID = key;
 99         }
100         #endregion
101     }
102 
103     [Serializable]
104     public class SysUserList : IfBusinessList<SysUserList, SysUser>
105     { }
106 }
View Code

现在就可以工作了:
全表检索数据方法:

1 SysUserList selData = SysUserList.Fetch();
View Code

 

向数据库新增一条数据:

 1 SysUser.Business.SysUser user = new SysUser.Business.SysUser();
 2 
 3 user.UserName= "inaction";
 4 
 5 user.Name = "流砂";
 6 
 7 user.Password= "superman";
 8 
 9 selData.Add(user);
10 
11 selData.Save();
View Code

 

向数据库修改数据:

1 var user = SysUserList.Fetch(c => c.UserName == "inaction");
2 
3 user.Password = "123456";
4 
5  SysUserList list = new SysUserList { user };
6  list.Save();
View Code

以上代码就实现了对密码的修改。

特别说明:目前IF 只能通过SysUserList对象的Save方法保存数据。以后会实现通过业务类自身Save方法保存数据。

 

附:源码下载地址

 

 

posted @ 2013-11-25 09:07  流沙inaction  阅读(562)  评论(1编辑  收藏  举报