zoukankan      html  css  js  c++  java
  • 自己写数据库访问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方法保存数据。

    附:源码下载地址

  • 相关阅读:
    centos6和centos7升级openssh7.5脚本
    开通telnet服务,使用telnet登入
    彻底删除kafka的topic以及其中的数据
    redis集群创建
    curl 命令参数
    nginx.conf配置文件详解,白嫖的
    logstash迁移es数据
    es 常用查询
    pl/sql 存储过程
    es查看集群信息命令_cat和_cluster
  • 原文地址:https://www.cnblogs.com/nactioncsla/p/3439820.html
Copyright © 2011-2022 走看看