三、手写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;
        }

  

 
原文地址:https://www.cnblogs.com/cg-ww/p/13072546.html