Nhibernate GetEntry与未保存的实体对象

时间:2014-01-12 21:18:31

标签: c# nhibernate

在我保存实体之前,我想检查它是否脏 所以我从ajax回来了实体对象。 (带身份证)。
该对象尚未保存,我想用它获取实体条目:

// this will return null, I assume it is because the object it not persisted yet.
session.GetSessionImplementation().PersistenceContext.GetEntry(entity);

// this will return what I want, but merge will save the object...
session.GetSessionImplementation().PersistenceContext.GetEntry(session.Merge(entity));

这不是脏和不脏的背后的整个想法,是在保存动作之前知道它们吗? 如何在没有持久化对象的情况下获取对象的条目?

更新
为了给出一个真实的用例,让我们说我的方法NhiUtil.IsPropertyDirty在里面做GetEntry

if(NhiUtil.IsPropertyDirty("Password",userEntityFromClient, session)){
    userEntityFromClient = Hush(userEntityFromClient.Password);
}
session.SaveOrUpdate(userEntityFromClient);

如果我被强迫在IsPropertyDirty内合并/保存userEntityFromClient以使GetEntry工作,我无法在实际保存之前做出业务逻辑决定...
所以整个IsPropertyDirty都无法使用......

由于

1 个答案:

答案 0 :(得分:3)

这就是我们拥有NHiberante的原因。如果您仔细阅读了有关ORM的问题,那么您必须找到为什么这些工具。这就是他们为我们做的事情。

换句话说,执行标准步骤:

  • 1)通过反序列化
  • 从客户端(上层/层)获取对象
  • 可选从session.Get(id)获取对象并绑定它,稍后跳过合并
  • 可选执行验证(业务层)
  • 2)合并对象session.Merge()并调用SaveOrUpdate()
  • 3)刷新会话

这很漂亮。 1)如果我们首先使用id-get-id并从收到的数据(JSON)绑定对象,我们已经在 ISession 中有了一个对象。而ISession是为我们做脏检查的那个

如果我们有分离的对象,请使用session.Merge(),这将再次为ISession内的所有人做。

冲洗,只有脏

本质是3)法拉盛。仅当对象脏时,它才会转换为Update / Insert语句。如果它是相同的(未更改)...没有调用数据库引擎

一些有趣的消息来源:

Chapter 24. Best Practices

  

在三层架构中,请考虑使用SaveOrUpdate()。

     

使用分布式体系结构时,可以将中间层中加载的持久对象传递给用户界面层或从用户界面层传递。使用新会话为每个请求提供服务。使用ISession.Update()或ISession.SaveOrUpdate()更新对象的持久状态。

9.4.2. Updating detached objects

  

... SaveOrUpdate()...

     

...使用Merge(Object o)。此方法将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久性实例,则将加载该实例。该方法返回持久化实例。如果给定的实例未保存或数据库中不存在,NHibernate将保存它并将其作为新的持久化实例返回。否则,给定实例不会与会话关联。在大多数具有分离对象的应用程序中,您需要两种方法,SaveOrUpdate()和Merge()。

也很有趣:艾恩德 - The difference between Get, Load and querying by id

12.1. Interceptors,允许挂钩某些事件,例如:

public override bool OnFlushDirty(object entity, 
    object id, 
    object[] currentState,
    object[] previousState, 
    string[] propertyNames,
    IType[] types)