确定NHibernate中的实体字段是否已更改

时间:2009-04-09 18:14:05

标签: nhibernate

我有一个需要确定字段是否已更改的调用。但是使用该实体id调用get将返回与先前版本不同的实体。

Entity e = Dao.Get(id);
//At this point e.Field is X
e.Field = y;
Dao.Save(e);

Entity Dao.Get(Guid id)
{
  return Session.Get(id);
}

Entity Dao.Save(Entity e)
{
   Entity olde = Session.Get(e.Id);
   if (e.Field != olde.Field) <--- e.Field == olde.Field so it does not run.
     DoBigMethod(e);
   return e;
}

如何在不向实体类添加onChange方法的情况下处理这种情况。

1 个答案:

答案 0 :(得分:1)

您只知道实体的一个“版本”:当前版本。 实际上只有一个版本的实体。你有它在内存中,你已经改变它,忘记了以前的状态。

调用get来查看以前的数据库状态是危险的。如果已经刷新了更改(例如,NHibernate在查询之前刷新),则会获得更改。如果您打开另一个会话,则会看到其他交易的更改。

你只对一个领域感兴趣吗?然后你可以在某处缓存旧值。

如果这不起作用,您需要告诉我更多有关您需要知道此字段之前值的原因。

编辑:

更多想法:

  • 在DAO.Get
  • 中获取对象时缓存字段的先前状态
  • 实现此属性,如果更改,则设置标志。
  • 考虑将此更改作为客户端调用的显式操作,而不是在标志更改时调用的隐式操作。例如,如果此标志被称为“已激活”,则实施“激活”和“取消激活”方法。此方法更改该标志并执行“大量代码”。该标志对于世界其他地区是只读的。