• 三、手写ORM实现数据库更新


    在更新时,不需要更新所有字段,因此要排除主键
    有些实体类字段或者表名与数据库字段不相符 解决办法:特性标记
     
    public  static class Extend
        {
            public static string GetMapping<T>(this T t) where T : MemberInfo  //继承属性和类共同的父类
            {
                if (t.IsDefined(typeof(BsAttributes), true))//如果找到BsAttributes,获取名称
                {
                    BsAttributes bs = (BsAttributes)t.GetCustomAttribute(typeof(BsAttributes), true);
                    return bs.Getname();
                }
                else
                {
                    return t.Name;
                }
     
            }
        }
    

      

    标记属性的特性类
       [AttributeUsage(AttributeTargets.Property)]  //属性
        public class KeysAuthAtturbute : BsAttributes
        {
            public KeysAuthAtturbute(string name) : base(name)
            {
            }
        }
    标记类名的特性类
     [AttributeUsage(AttributeTargets.Class)]  //
        public class TableAtturbute : BsAttributes
        {
            public TableAtturbute(string name):base(name)
            {
            }
        }
    都继承BsAttributes 类
    public class BsAttributes : Attribute
        {
            private string _name = null;
            public BsAttributes(string name)
            {
                this._name = name;
            }
            public  virtual string Getname()
            {
                return this._name;
            }
     
        }
    

      

     
    编写完成只需要在实体类标记·
     
    贴上代码
      public bool  Update<T>(T t)
            {
                Type type = typeof(T);
                //PropertyInfoKeys 是自己写的排除主键的方法
                string columString = string.Join(",", type.PropertyInfoKeys().Select(p => $"[{p.Name}]=@{p.Name}"));
                IEnumerable<SqlParameter> parameters = type.PropertyInfoKeys().Select(p =>
                new SqlParameter($"@{p.GetMapping}", p.GetValue(t) ?? DBNull.Value));
                string sql = $"update [{type.Name}] set {columString}  where ID=@ID";
                if (conn.State == System.Data.ConnectionState.Closed)
                {
                    conn.Open();
                }
                SqlCommand cmd = new SqlCommand(sql, conn);
                cmd.Parameters.AddRange(parameters.ToArray());
                int result = cmd.ExecuteNonQuery();
                return result==1;
            }
    

      

     
  • 相关阅读:
    linux-vi/vim
    Linux性能监控-ss
    Linux性能监控-netstat
    Linux性能监控-sar
    Linux性能监控-htop
    Linux性能监控-pstree
    Linux性能监控-ps
    查看linux占用内存/CPU最多的进程
    Linux性能监控-top
    Linux-cpu-socket/core/processor
  • 原文地址:https://www.cnblogs.com/cg-ww/p/13072546.html
Copyright © 2020-2023  润新知