我有两个课程如下:
class Parent
{
private readonly IDictionary<int, Child> _children
= new Dictionary<int, Child>();
public virtual IDictionary<int, Child> Children
{
get
{
return new ReadOnlyDictionary<int, Child>(_children);
}
}
public virtual Guid Id { get; set; }
public virtual int Version { get; set; }
// Methods to add and delete via underlying dictionary
}
class Child
{
public virtual Guid Id { get; set; }
public virtual int Version { get; set; }
}
这些使用NHibernate Fluent进行映射,如下所示:
// Parent
Id(m => m.Id);
Version(m => m.Version);
HasMany(m => m.Children).AsMap("Slot")
.Cascade.All()
.Access.CamelCaseField(Prefix.Underscore);
// Child
Id(m => m.Id);
Version(m => m.Version);
一般工作中的映射;我可以通过字典添加和删除孩子。
我的问题是,当我将子项添加到父项时,数据库会看到以下序列:
INSERT
1
子项
UPDATE
d,正确的外键但版本未更改。当我从父项中删除子项时,数据库会看到以下序列
UPDATE
d,其中包含NULL外键但版本未更改。在这两种情况下,出于我的目的,它是灾难性的,即使行更新,版本字段也不会更改。
在删除案例中,我可以强制更改(在我的域逻辑中)到子项上的其他属性,以便更新版本。但是,我完全无法控制插入案例中的更新。
OnPreUpdate
的{{1}}事件无法触发IPreUpdateEventListener
似乎没有拦截任何可以区分为此事件的内容有什么方法可以拦截这个更新事件,或者任何其他方式我可以强制NHibernate在更新发送到数据库时增加版本属性?
更新:我无法使用下面Radim Köhler 建议的TSQL IInterceptor
,因为我还需要能够手动更新版本字段存储过程。