我有一些课程-“设置”,其中存储了一些文件/数据的路径。也有实体,它们使用“设置”来构建自己的路径。 我想在更改设置时验证实体路径,并在需要时保存它。
具有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
属性,该属性可以过滤保存时会话中的一些无效更改(例如对异常的验证)。
想要使“设置”中的更改路径具有事务性。当然,我可以在交易后更改它,但是我不能保证数据的有效性。