在OnFlushDirty事件(或事务中的任何地方)中更改另一个实体

时间:2018-07-16 16:37:50

标签: c# nhibernate

我有一些课程-“设置”,其中存储了一些文件/数据的路径。也有实体,它们使用“设置”来构建自己的路径。 我想在更改设置时验证实体路径,并在需要时保存它。

具有Interceptor和覆盖OnFlushDirty事件:

var folderIndex = propertyNames.ToList().IndexOf(nameof(Folder));
if (folderIndex > -1 && previousState != null)
{
  var previous = previousState[folderIndex] as string;
  var current = currentState[folderIndex] as string;
  if (previous != current)
  {
    var someEntities = session.Query<ISomeEntity>().Where(m => m.Setting == entity).ToList();
    foreach (var someEntity in someEntities)
    {
      someEntity.RefreshFolder(); // Refresh properties
    }
  }
}

我当时在想,如果更改已经提交,它们将自动附加。 我尝试在“ someEntity.RefreshFolder()”之后添加“ session.SaveOrUpdate(someEntity)”,但没有结果,则无法保存实体。

设置将包装保存到事务中

using (var tranc = session.OpenTransaction())
{
  try
  {
    session.SaveOrUpdate(setting);
    tranc.Commit();
  }
  catch (System.Exception)
  {
    tranc.Rollback();
    throw;
  }
}

SomeEntity引用了设置(p.1),并且在尝试创建隔离的事务时,我正在捕获SO, 因为保存实体需要保存设置,这会导致保存事件等。

所有会话都具有session.FlushMode = FlushMode.Commit属性,该属性可以过滤保存时会话中的一些无效更改(例如对异常的验证)。

想要使“设置”中的更改路径具有事务性。当然,我可以在交易后更改它,但是我不能保证数据的有效性。

0 个答案:

没有答案