我有以下代码单向一对多关联:
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假设他必须处理该集合,以及如何避免这种行为?
答案 0 :(得分:2)
将Inverse
属性设置为true
。这将让nhibernate知道它不应该处理集合更改,而是必须将更改保留到其他地方的任何B
引用。
如果已从Values
删除引用,您仍然可以级联删除孤立以删除从A到B的引用...
示例:
[Set(0, Cascade = "all-delete-orphan", Inverse=true, Lazy = CollectionLazy.False)]