反射做字段更新日志

Posted nbu_djw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射做字段更新日志相关的知识,希望对你有一定的参考价值。

思路给类的属性加特性标签,重写savechanges方法,获取当前entry反射查看是否存在标记为通知修改做日志的属性。

 [Table("Student")]
    public partial class Student
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int id { get; set; }

        [StringLength(50)]
        [Notice]
        public string Name { get; set; }

        [Notice]
        public int Age { get; set; }
    }

    public class NoticeAttribute : Attribute
    { }
  public override int SaveChanges()
        {
            ObjectContext context = (this as IObjectContextAdapter).ObjectContext;

            foreach (ObjectStateEntry entry in context.ObjectStateManager
                      .GetObjectStateEntries(EntityState.Added | EntityState.Modified))
            {
                var model = entry.Entity;
                //获取类型方式1
                var t1 = model.GetType();
                //获取类型方式2
                //var t2 = ObjectContext.GetObjectType(t1);
                //获取类型方式3
                //var ass = Assembly.GetExecutingAssembly();
                //var name = ass.GetName();
                //var type=ass.GetType(name.Name+ "."+t1.Name);


                //获取当前实体所有标记为修改的属性
                var mp = entry.GetModifiedProperties();
                //获取类的所有属性             
                var pro = t1.GetProperties();
                //日志信息
                StringBuilder log = new StringBuilder();
                log.Append("当前用户\\t").Append(t1.Name).Append("\\t属性\\t");
                foreach (var p in pro)
                {
                    //判断类的属性是否有通知修改的特性
                    var atr = p.GetCustomAttribute(typeof(NoticeAttribute));
                    //如果属性有标记修改的特性,并且当前实体此属性标记为modified
                    if (atr != null && mp.Contains(p.Name))
                    {
                        //var value = entry.CurrentValues;
                        //var data = entry.CurrentValues.DataRecordInfo.FieldMetadata.FirstOrDefault(f=>f.FieldType.Name==p.Name);

                        //获取当前属性值
                        var result = p.GetValue(model);
                        log.Append(p.Name).Append("\\t修改为\\t").Append(result).Append("\\t");

                    }

                }
                Console.WriteLine(log.ToString());

            }


            return base.SaveChanges();
        }
  static void Main(string[] args)
        {
            Model1 db = new Model1();
            var student= db.Students.FirstOrDefault();
            student.Name = "sfdsfsfsf";
            student.Age = 18;

            DbEntityEntry<Student> entry = db.Entry<Student>(student);
            entry.State = System.Data.Entity.EntityState.Unchanged;
            entry.Property("Name").IsModified = true;
            entry.Property("Age").IsModified = true;

            db.SaveChanges();

            Console.ReadKey();

        }

 

以上是关于反射做字段更新日志的主要内容,如果未能解决你的问题,请参考以下文章

8. 数据莫名被覆盖问题

8. 数据莫名被覆盖问题

光照 漫反射光照

光照 漫反射光照

光照 漫反射光照

光照 漫反射光照