`

自定义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(
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赋值几个属性,将来就只是更新几个属性,是不是可以简化这个过程呢?反正我这里就有这样的需求,还不少呢?开始我也没有用这个方法,最近才想出来的。不知道各位如何认为呢?

  希望提出更好好的意见。

0
1
分享到:
评论

相关推荐

    自己写的ORM

    3. **会话(Session)/上下文(Context)**:管理数据库连接和事务,提供对象的持久化操作。在自定义ORM中,你需要实现一个类来管理这些功能,比如添加、删除、更新对象,并处理数据库连接。 4. **查询(Querying)...

    Grove——.NET中的ORM实现

    Grove是专为.NET平台设计的一款ORM实现,它提供了对象持久化、关系对象查询、简单事务处理和异常管理等功能。Grove ORM Development Toolkit分为Grove和Toolkit两部分,Grove负责ORM的核心功能,而Toolkit是一个...

    InstantObjects Delphi的ORM

    1. **对象持久化**:通过ORM,你可以将Delphi类实例直接保存到数据库中,反之亦然。这意味着你可以创建一个类,定义其属性,然后这些属性将自动与数据库表的列对应,无需编写SQL语句进行CRUD(创建、读取、更新、...

    java-android-orm-db-example:该项目显示了使用某些设计模式和Java Reflection API的自定义ORM实现

    本项目“java-android-orm-db-example”是针对Android平台的一个自定义ORM实现,它巧妙地结合了设计模式和Java Reflection API,为开发者提供了更便捷的数据持久化方案。 首先,让我们深入了解一下ORM的基本概念。...

    简要分析Java的Hibernate框架中的自定义类型

    `UserType`提供了对Java对象和数据库列之间转换的一系列方法,包括获取SQL类型的数组(`sqlTypes()`)、返回对象的Java类(`returnedClass()`)、比较两个对象的持久化相等性(`equals()`)、计算对象的哈希值(`...

    Sugar (Android orm )

    通过使用ORM技术,开发者可以将Java对象直接映射到数据库表,极大地简化了数据持久化的复杂性。 在Android开发中,数据存储通常涉及SQLite数据库,而手动编写SQL语句和管理数据库会增加代码的复杂度和维护成本。...

    php 简单的数据持久层代码库

    这种自定义ORM可能包括了如下的功能: 1. **实体类(Entity Class)**:这是ORM中的基础,每个实体类代表数据库中的一个表。开发者可以定义类属性来对应表的字段,ORM会自动处理这些对象与数据库记录之间的转换。 ...

    XPO数据控件详细使用说明

    2. **持久化类**:这种类能够将实例数据持久化到数据库中,通过XPO,一个普通类可以被映射到数据库的一个表,类的字段对应表的列。 **XPO的核心功能:** - **对象映射**:XPO将对象模型与数据库模型进行映射,使得...

    orm框架的底层实现机制共.pdf

    ORM框架的主要目的是解决编程语言(特别是面向对象语言)和关系型数据库之间的“阻抗不匹配”问题,提供了一种抽象层,使开发者能够将业务对象和数据库表之间的映射关系透明化处理。 在ORM框架的底层实现机制中,...

    EntityFramework数据持久化复习资料1、委托(课件与源码) 包含基本的委托示例以及多播委托,项目源码,解压后直接使用

    当你创建一个继承自DbContext的自定义类,并在其中定义DbSet属性来代表数据库表时,就可以通过添加、删除、更新和查询方法来操作数据。 接下来,我们讨论“委托”。在.NET中,委托是一种类型安全的函数指针,可以...

    jpa的自定义CURD

    删除实体可以使用`remove()`方法,但在此之前,需要确保该实体已被加载到持久化上下文中。 ```java em.getTransaction().begin(); User userToRemove = em.find(User.class, 1L); em.remove(userToRemove); em....

    Telerik OpenAccess ORM Q3 2009 Manuals (2009年11月3日版本)

    ORM框架的核心功能在于将数据库表与C#或VB.NET等编程语言中的类映射起来,自动处理数据的持久化。Telerik OpenAccess ORM 提供了以下关键特性: 1. **代码自动生成**:通过元数据描述,OpenAccess可以自动生成与...

    ORM

    - **移植性**:ORM框架通常支持多种数据库,换库时只需更改配置,无需大量修改代码。 - **容错性**:ORM框架通常包含了一些错误检查和异常处理机制,可以减少因数据库操作引发的问题。 然而,ORM也有其局限性,如...

    用友U9自定义单据(初级)-处理重叠问题版.pdf

    - **定义**:BE即业务实体,是用友U9系统中用于表示后台可持久化数据的对象。 - **作用**:作为数据库表的内存映射,通过对象关系映射(ORM)技术实现数据的加载和保存,使得开发过程不受具体数据库的影响。 - **BE...

    node-postgre-orm:一个Node.js postgresql ORM

    1. **模型定义**:`node-postgre-orm`允许开发者定义JavaScript类作为数据库表的模型,类的属性对应表的字段,类的方法对应于数据库操作。 2. **CRUD操作**:通过ORM,可以方便地执行创建(Create)、读取(Read)...

    persistent object of dlephi

    结合以上信息,这个开源项目提供了一个Delphi环境下的持久化对象框架,支持多种数据库系统,并且提供了源代码,开发者可以根据需要自定义和扩展。它利用控件和数据集来直观地操作持久化对象,同时通过对象关系映射...

    一个Persistance System是C#中用于对象持久化的框架-开源

    在IT行业中,对象持久化是将程序中的对象数据存储到持久性存储介质(如数据库)中的过程,以便在后续的程序运行中可以恢复这些数据。一个名为“Persistance System”的框架,专门针对C#编程语言设计,旨在简化这个...

    Hibernate Reference Documentation

    4. 持久化类的相关知识点,从简单的POJO(Plain Old Java Object)示例开始,讲解了如何声明访问器和修改器方法、实现无参构造函数、提供标识属性以及实现继承。持久化类是Hibernate映射的核心,该部分展示了如何在...

Global site tag (gtag.js) - Google Analytics