使用主动实体(ActiveEntity)简化继承体系映射类的写操作

在上一篇文章ORM中的继承关系映射全解中,演示了各种继承关系映射在NBear中实现示例,只不过,文中的示例对于一实体一具体表和一实体一扩展表方案下的子类的保存操作,需要用户手动save实体本身和其所有的父类对应的表。这多少有点不爽,因为,实体的用户是很难全都了解具体要save多少表的。为了解决这个问题,在最新的v2.1.6版中,为NBear新增了一个ActiveEntity类。ActiveEntity类最大的作用是封装了子类的插入,修改和删除操作。另外,ActiveEntity能够自动记录修改过的字段属性,因此,写数据库时,它只会Update真正修改过的实体的属性。在下面的示例中我们可以看到,如何使用ActiveEntity来简化前文介绍的实体继承中的一实体一具体表和一实体一扩展表示例。更多细节可以参考NBear中文用户手册。

--

NBear v2.1.6 除了新增了本文探讨的ActiveEntity类,还有如下重要更新:

1)Gateway.ExecuteProcedureXXX方法新增了对存储过程输出参数的支持;

2)修复了一个Gateway.Save中可能导致事务死锁的bug;

--

ActiveEntity包含如下成员:

范型参数列表

//Must give an IEntity when creating an instance
public class ActiveEntity<IEntityType> where IEntityType : IEntity

构造函数

//Create an active entity based on an given entity
public ActiveEntity(Gateway gateway, IEntityType obj)
//Create an active entity by given values of PKs, if no values are given, create an empty new active entity.
public ActiveEntity(Gateway gateway, params object[] pkValues)

属性

//The status of active entity, available values are ActiveEntityStatus.New and ActiveEntityStatus.Loaded.
public ActiveEntityStatus Status
//The entity can be read/write directly
public IEntityType Entity

公共方法

public void Save()
public void Save(DbTransaction tran)
public void Delete()
public void Delete(DbTransaction tran)

使用示例

1. 简单示例

对于一个简单的Northwind中的Category实体,我们可以这样简化对其的Save和Delete操作:

  [Table("Categories")]
  public interface Category : IEntity
  {
    [PrimaryKey]
    int CategoryID { get; }
    string CategoryName { get; set; }
    string Description { get; set; }
    System.Byte[] Picture { get; set; }
  }
--
      ActiveEntity<Category> obj = new ActiveEntity<Category>(gateway, 1); //Load
      Assert.AreEqual(obj.Status, ActiveEntityStatus.Loaded); //After Load, The status become Loaded
      string newCatName = Guid.NewGuid().ToString().Substring(0, 5);
      obj.Entity.CategoryName = newCatName;
      obj.Save(); //do saving, since only CategoryName is modified, the sql created and executed behind the framework only updates the CategoryName column of Categories table

      ActiveEntity<Category> obj2 = new ActiveEntity<Category>(gateway); //create a new empty active entity for Category
      Assert.AreEqual(obj2.Status, ActiveEntityStatus.New); //A new active entity's status is New before saving
      obj2.Entity.CategoryName = obj.Entity.CategoryName + "_new";
      obj2.Entity.Description = obj.Entity.Description;
      obj2.Entity.Picture = obj.Entity.Picture;
      obj2.Save(); //do inserting
      obj2.Delete(); //do deleting

时间: 2024-08-03 11:14:46

使用主动实体(ActiveEntity)简化继承体系映射类的写操作的相关文章

ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表

ORM中的继承关系映射全解--单表继承体系.一实体一具体表.一实体一扩展表.接口映射 本文涉及的内容包括: 1.单表继承体系 2.一实体一具体表 3.一实体一扩展表 4.接口实现映射vs基类继承映射 1.单表继承体系 所谓单表继承体系就是用一张数据库表存储整个继承体系中的所有实体的数据.单表继承体系适合那种继承体系中实体数目相对较少,总记录数相对较少,子类对父类的属性扩展也相对较少的情形. 单表继承体系优点是读/写继承体系中的每个实体的数据,都只需操作一张表,性能较好,并且,新增继承类,或扩展实

实例解析继承体系重构及ORM映射

本文以双鱼座同学的再说继承关系一文中提到的一组三元继承关联关系为基础. 首先,分别实现本人的ORM中的继承关系映射全解一文中提到的三种实体继承体系到关系数据库的映射方案实例. 接着,使用接口分离以上继承体系中的实体类中的相同概念,对该继承体系进行重构,并同样给出对重构后的继承体系的三种到关系数据库的映射方案实例. 全部实例代码基于NBear的接口式实体定义方式实现. 1. 背景 首先,给出双鱼座同学原文中的三元继承关联关系的等价接口定义.见下图1: 2. 对图1-1的ORM映射 2.1 单表继承

JBuilder2005实现重构之类继承体系间

在JBuilder中通过重构将值域.方法在类的继承体系中上推下移,是非常容易的操作.这了说明这种重构功能,我们先来看下面的类继承体系: 图15 类的继承类图 Animal类是Cat和Horse和父类,Animal中包含了两个值域和一个方法.可以将Animal中的值域有选择地下移到某个子类中.此外,还可以为Animal提炼超类和接口. 1.搬迁方法 打开Animal.java并将光标定位到howl()方法处,通过Ctrl+Shift+R->Push Down Method调出下移方法对话框: 图1

《Effective Ruby:改善Ruby程序的48条建议》一第6条:了解Ruby如何构建继承体系

第6条:了解Ruby如何构建继承体系 问题:当你向一个对象发送消息时,你知道Ruby是怎么定位到那个正确的方法的吗?答案看上去很简单:使用继承体系.之所以说答案是看上去简单,因为Ruby构建继承体系是在幕后进行的.这是Ruby用自己的方式来隐藏真正发生的事情的罕见情形之一,它常常带来不必要的困惑.Ruby提供给我们的用来发现继承关系中的类的方法并能完全解释其本质.还好,Ruby解释器在内部构建的继承体系是一致而简单的,只要你明白一些它的技巧. 探索Ruby查询方法的机制将揭开语言实现方式的面纱,

菜鸟问一个hibernate关于继承关系映射的配置问题

问题描述 菜鸟问一个hibernate关于继承关系映射的配置问题 按照教学视频配置: <class name="Employee" discriminator-value = "0"> <id name="id"> <generator class="native"></generator> </id> <property name="name&quo

重构——65折叠继承体系(Collapse Hierarchy)

折叠继承体系(Collapse Hierarchy) 超类和子类之间无太大区别:将它们合为一体 一.动机 1.继承体系很容易变得过分复杂 2.重构了继承体系后,有些类没有用了,需要把子类和超类合并起来 二.做法 1.选择想要移除的类:是超类还是子类 2.Pull Up Field,Pull Up Method或者 Push Down Method, Push Down Field 3.每次移动后,编译并测试 4.调整即将被移除的那个类的所有引用点,令它们改而引用合并后留下的类.这个动作将会影响变

重构——69梳理并分解继承体系(Tease Apart Inheritance)

梳理并分解继承体系(Tease Apart Inheritance) 某个继承体系同时承担两项责任:建立两个继承体系,并通过委托关系让其中一个可以调用另一个 动机 1.如果继承体系中的某一个特定层级上的所有类,其子类名称都是以相同的形容词 2.开始,那么这个体系就很可能承担着两项不同的责任

重构——72提炼继承体系(Extract Hierarchy)

提炼继承体系(Extract Hierarchy) 你有某个类做了太多工作,其中一部分工作以大量条件表达式完成 建立继承体系,以一个子类表示一种特殊情况 动机 渐进式设计

Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍_python

1. 创建映射类的实例(Instance) 前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象: 复制代码 代码如下: >>> ed_user = User('ed', 'Ed Jones', 'edspassword')>>> ed_user.name'ed'>>> ed_user.password'edspassword'>&g