• 自定义ORM系列(二)发现属性是否修改,有选择的持久化 Virus


      

      引言

      今天给大家介绍的是ORM中的有选择持久化技术。现在的很多ORM工具都支持有选择的持久化,就是对于属性有选择的持久化。也可以理解为只持久化那些有变化的属性,忽略没有变化的属性。

      

      正文

      很多时候我们想要知道实体的那些属性被更新,那些属性没有变化。

      在很多的ORM工具中,在持久化数据的时候,可以判断哪些属性有值,哪些属性被更新过,这样的属性才会被持久化,没有动过的属性不会被持久化,而不是所有的属性都持久化。

      发现属性有变化,有很多种办法。今天我给大家介绍一种,利用Inotifypropertychanged接口来实现属性变化的跟踪。一个类如果实现了这个接口,就可以跟踪属性的变化,然后定义一个集合,把发生变化的属性记录下来。这样,在持久化的时候,就可以针对变化的属性进行有选择性的持久化了。

      

    BookPo
     public class BookPo : INotifyPropertyChanged
        {
            
    public event PropertyChangedEventHandler PropertyChanged;

            
    private Guid _id;
            
    public Guid ID
            {
                
    get { return _id; }
                
    set
                {
                    _id 
    = value;
                    OnPropertyChanged(
    "ID");
                }
            }

            
    private string _name;
            
    public string Name
            {
                
    get { return _name ;}
                
    set { _name = value;
                    OnPropertyChanged(
    "Name"); }
            }

            
    private string _author;
            
    public string Author
            {
                
    get { return _author; ;}
                
    set { _author = value;
                    OnPropertyChanged(
    "Author"); }
            }

            
    public List<string> ChangeProperties
            {
                
    get;
                
    set;
            }
            
    protected void OnPropertyChanged(string propertyName)
            {
                
    if (PropertyChanged != null)
                PropertyChanged(
    thisnew PropertyChangedEventArgs(propertyName));
                
    if (ChangeProperties == null)
                {
                    ChangeProperties 
    = new List<string>();
                }
                ChangeProperties.Add(propertyName);
            }
        }

      如果将类定义为上面的格式,调用代码如下

    BookPo bookPo = new BookPo(); 
                bookPo.ID 
    = Guid.NewGuid();
                bookPo.Author 
    = "作家";

      那么经过上面的几行代码之后,对象的ChangeProperties集合中就只有两个属性:ID和Author。无论是添加还是更新,就只包含着两个属性就可以了。当然了,还需要定义一个主键的attribute,给ID属性打上一个标志,表面ID是主键,然后更新的时候就有了where后面的条件了,就可以定位了,不会找不到更新的对象了。

      每个需要持久化的类都需要添加下面的ChangeProperties属性和实现接口,然后写个OnpropertyChanged方法。是有点多了,所以可以定义一个基类,实现接口,包含方法和集合属性,然后每个持久化类都继承他们。

      在[WPF/Silverlight]让INotifyPropertyChanged的实现更优雅一些 中,作者还有更好的实现,大家可以过去看看。

      这么做其实还有另外一个好处,就是不用为每次更新写一个存储过程或者是SQL语句了。

      我来解释一下上面的这句话。比如说有下面的这个类设计。

    Person
     public class Person
        {
            
    public Guid ID { getset; }

            
    public string Name { getset; }

            
    public string Username { getset; }
        }

        
    public enum PersonStatus
        {
            
    /// <summary>
            
    /// 正常
            
    /// </summary>
            Normal,
            
    /// <summary>
            
    /// 挂起
            
    /// </summary>
            Suspend,
            /// <summary>
            
    /// 审核
            
    /// </summary>
            Auditing
        }

      一个用户信息,有一个属性是用户状态。用户在注册之后,可以提交申请,然后管理员审核用户。用户可以更新个人的其他信息(除去状态)。这个需求里面包含两个个更新的方法,一个是用户更新个人信息,一个是管理员审核用户信息,需要更新用户状态。

      要么写两个存储过程,或者是两个TSQL语句。如果实体实现了INotifyPropertyChanged,按照我上面的方法,就保留一个Update方法就可以了,给PersonPo赋值几个属性,将来就只是更新几个属性,是不是可以简化这个过程呢?反正我这里就有这样的需求,还不少呢?开始我也没有用这个方法,最近才想出来的。不知道各位如何认为呢?

      希望提出更好好的意见。

  • 相关阅读:
    Mybatis中javaType和jdbcType对应关系
    spy日志
    mybatis批量插入和更新
    js打印方案
    js弹窗,父子窗口调用
    extjs4.1
    oracle开启远程连接访问
    javaweb打印
    Leetcode 392.判断子序列
    Leetcode 391.完美矩形
  • 原文地址:https://www.cnblogs.com/virusswb/p/1910288.html
Copyright © 2020-2023  润新知