zoukankan      html  css  js  c++  java
  • 反射做字段更新日志

    思路给类的属性加特性标签,重写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("当前用户	").Append(t1.Name).Append("	属性	");
                    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("	修改为	").Append(result).Append("	");
    
                        }
    
                    }
                    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();
    
            }

  • 相关阅读:
    万恶的"unrecognized selector sent to instance"颤抖吧
    QT 中 QGLWidget 不能够嵌入到 QGraphicsView 中及解决方案
    程序代码里的幽默精神
    objectivec 中如何使用 c++?
    基于FPGA的跨时钟域信号处理——同步设计的重要
    亚稳态
    行为级和RTL级的区别
    FPGA同步复位,异步复位以及异步复位同步释放实例分析
    基于FPGA的跨时钟域信号处理——专用握手信号
    FPGA中亚稳态——让你无处可逃
  • 原文地址:https://www.cnblogs.com/tgdjw/p/5841319.html
Copyright © 2011-2022 走看看