当NHibernate更新AsMap外键时,版本不会更新

时间:2014-09-22 13:52:39

标签: nhibernate fluent-nhibernate foreign-keys version

我有两个课程如下:

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);

一般工作中的映射;我可以通过字典添加和删除孩子。

我的问题是,当我将子项添加到父项时,数据库会看到以下序列:

  • 使用null外键和版本INSERT
  • 编译1子项
  • 子项UPDATE d,正确的外键但版本未更改

当我从父项中删除子项时,数据库会看到以下序列

  • Child为UPDATE d,其中包含NULL外键但版本未更改

在这两种情况下,出于我的目的,它是灾难性的,即使行更新,版本字段也不会更改。

在删除案例中,我可以强制更改(在我的域逻辑中)到子项上的其他属性,以便更新版本。但是,我完全无法控制插入案例中的更新。

  • OnPreUpdate的{​​{1}}事件无法触发
  • IPreUpdateEventListener似乎没有拦截任何可以区分为此事件的内容

有什么方法可以拦截这个更新事件,或者任何其他方式我可以强制NHibernate在更新发送到数据库时增加版本属性

更新:我无法使用下面Radim Köhler 建议的TSQL IInterceptor,因为我还需要能够手动更新版本字段存储过程。

0 个答案:

没有答案