NHibernate级联无人还在更新孩子

时间:2014-01-03 02:49:48

标签: c# nhibernate nhibernate-mapping

我有以下代码单向一对多关联:

Class A{

    [Set(0, Lazy = CollectionLazy.False, Cascade = "none")]
    [Key(1, Column = "A_id")]
    [OneToMany(2, ClassType = typeof(B))]
    public virtual ISet<B> Values { get; set; }
}

 Class B{
 }

然后,我有表A和表B,它有一个名为A_ID的外键列。

每当我合并一个实体A的新实例时,我都会收到一个错误,说A_ID列不能为null,这意味着nhibernate仍在尝试对B实体进行级联“排序”,即使我明确地使用“无”。

堆栈如下:

could not delete collection: [A.Values#/Global/Rowstamps/User][SQL: UPDATE B SET A_id = null WHERE A_id = ?p0]]
   NHibernate.Persister.Collection.AbstractCollectionPersister.Remove(Object id, ISessionImplementor session) +1057
   NHibernate.Action.CollectionRemoveAction.Execute() +206
   NHibernate.Engine.ActionQueue.Execute(IExecutable executable) +48
   NHibernate.Engine.ActionQueue.ExecuteActions(IList list) +128
   NHibernate.Engine.ActionQueue.ExecuteActions() +65
   NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) +215
   NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) +179
   NHibernate.Impl.SessionImpl.Flush() +293

我正在合并一个新的A实例,它有一个空的B组。

问题是为什么nhibernate假设他必须处理该集合,以及如何避免这种行为?

1 个答案:

答案 0 :(得分:2)

Inverse属性设置为true。这将让nhibernate知道它不应该处理集合更改,而是必须将更改保留到其他地方的任何B引用。

如果已从Values删除引用,您仍然可以级联删除孤立以删除从A到B的引用...

示例:

[Set(0, Cascade = "all-delete-orphan", Inverse=true, Lazy = CollectionLazy.False)]