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

简介:

  引言

  今天给大家介绍的是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(
this new  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 {  get set ; }

        
public   string  Name {  get set ; }

        
public   string  Username {  get set ; }
    }

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

 

 

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

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

  希望提出更好好的意见。






本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/460454,如需转载请自行联系原作者xhttp://blog.51cto.com/virusswb/460454,如需转载请自行联系原作者

目录
相关文章
|
Java 数据库连接 数据库
hibernate查询出的实体,set值后,自动更新到数据库
hibernate查询出的实体,set值后,自动更新到数据库
422 2
hibernate查询出的实体,set值后,自动更新到数据库
|
Java 数据库连接 数据库
Hibernate的方法获取对象后,对象调用set后会自动更新数据库内容的解决办法
Hibernate的方法获取对象后,对象调用set后会自动更新数据库内容的解决办法
714 0
|
存储 Java Spring
AutoConfiguration加载元数据和自动配置组件
@EnableAutoConfiguration 加载元数据配置 加载元数据配置主要是为后续操作提供数据支持。 我们先来看加载相关源代码的具体实现,该功能的代码依旧日在 selectlmpots 方法内。 @Override publicString[] selectImports (AnnotationMetadata annotationMetadata) { AutoConfigurat ionMetadata autoConf igurationMetadata = AutoConfigurationMetadataLoader. loadMetadata(this. bea
163 0
AutoConfiguration加载元数据和自动配置组件
|
SQL 存储 数据库
ORM映射框架总结--数据操作(六)
1. 数据库操作接口 IDbHelper 代码 /** *  * 2009-4-22 *  *  * 提供各种数据库操作方法以及实体类操作方法 * */using System;using System.
632 0
|
SQL
ORM映射框架总结--数据操作(四)
1.BaseEntityHelper 解析实体类特性 代码   1 /**  2  *   3  * 2009-4-17  4  *   5  *   6  * 字段的特性  7  * */  8 using System;  9 using System.
725 0
|
数据库连接 数据库
ORM映射框架总结--数据操作(五)
1.数据库加载驱动和操作接口 IDbProvider 代码  1 /** 2  *  3  * 2009-4-22 4  *  5  *  6  * 数据库操作加载驱动接口,  7  * 提供了数据库操作的各种命令  8  * */ 9 using System;10 using System.
772 0
|
存储 SQL 数据库
ORM映射框架总结--数据操作(七)
2. 数据库操作实现类 SqlHelper 代码 /** *  * 2009-4-22 *  *  * 数据库操作的公共类 * */using System;using System.Collections.
673 0
|
Web App开发
ORM映射框架总结--Excel 操作
  在很多时候,我们需要将查询的数据做成报表统计,然后生成Excel文档格式的。再此提供了将DataTable 数据导出excel 的方法   代码   1 /**  2  *   3  * 2009-5-2  4  *   5  *   6  * 将DataTable导出为excel文件  7  * */  8 using System;  9 using System.
880 0
|
SQL 存储 .NET
ORM映射框架总结--数据库操作库(精修版)
1.       ORM数据库操作原理 前面已经介绍过了个人ORM映射框架中的三个核心库: 实体—数据库 映射特性关系: http://www.cnblogs.com/qingyuan/archive/2010/04/02/1702998.
1364 0
|
移动开发 监控 .NET
ORM映射框架总结--日志处理
  在我们做项目的过程中,日志跟踪异常是非常必要的,当程序发布到服务器上时,如果出现异常直接抛出给用户这是非常不友好的。对于不懂程序的用户来说,这回让人感觉莫名其妙,对于那些程序高手,可能就是攻破这个网站的关键。
698 0