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

确定NHibernate中的实体字段是否已更改,nhibernate,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);

我有一个电话,需要确定字段是否已更改。但是使用该实体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;
}
实体e=Dao.Get(id);
//在这一点上,e场是X
e、 字段=y;
Dao.Save(e);
实体Dao.Get(Guid id)
{
返回会话.Get(id);
}
实体Dao.Save(实体e)
{
实体olde=Session.Get(e.Id);
如果(e.Field!=olde.Field)您只知道该实体的一个“版本”:当前版本。实际上该实体只有一个版本。您将其保存在内存中,并且您已经更改了它并忘记了以前的状态

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

您是否只对一个字段感兴趣?然后可以将旧值缓存到某个位置

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

编辑:

还有一些想法:

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

我们在用户身上有一个标志,如果用户发生更改,该标志将运行大量代码。在某些情况下,此代码将引发异常。如果他们只是在更新其他字段,我不需要进行此检查。在这些情况下,不太可能出现异常。我在回答中添加了一些其他想法。希望能有所帮助。