ObjectDeletedException:为什么NHibernate不能自动打破关联
本文关键字:关联 不能 为什么 NHibernate ObjectDeletedException | 更新日期: 2023-09-27 17:54:05
我有一个一对一的映射,我试图用流利的NHibernate映射来表达。我知道网上有很多类似的问题/答案,但几个小时后,我很难找到我的具体问题的答案。
我有一个Member
和Subscription
对象。一个成员可以有0..1订阅和订阅实例只能属于单个成员。
这是我的类:
public class Member
{
public Subscription Subscription { get; set; }
}
public class Subscription
{
public Member Member { get; set; }
public DateTime StartDate { get; set; }
public DateTime FinishDate { get; set; }
}
这是我的映射(流利):
成员:mapping.HasOne(member => member.Subscription)
.PropertyRef(subscription => subscription.Member).Cascade.SaveOrUpdate();
为订阅:mapping.References(subscription => subscription.Member)
.Unique().Cascade.None();
有一些要求,但我似乎不能全部满足:
-
Member
级联到Subscription
。 - 删除
Subscription
会断开Member
的关联。 - 删除
Subscription
不会删除Member
。
如果我在Member
上设置Cascade,则保存Subscription
,但删除Subscription
会抛出ObjectDeletedException
。
为什么NHibernate不能在对Member
应用级联之前先自动删除与Subscription
的关联?
这里的基本问题是,这不是一个一对一的关系,而是一个一对多的关系,其中多侧被限制为0或1。在一对一关系中,两个实体必须具有相同的主键,而这里显然不是这样。请看这个问题
我将其建模为
public class Member
{
private ICollection<Subscription> _subscriptions;
public Name() { _subscriptions = new HashSet<Subscription>(); }
public Subscription Subscription
{
get { return _subscriptions.SingleOrDefault(); }
set
{
_subscriptions.Clear(); // may want to check if it contains value first
value.Member = this; // assuming bidirectional association
_subscriptions.Add(value); // null check value first
}
}
}
mapping.HasMany<Subscription>(Reveal.Member<Member>("_subscriptions"))
.KeyColumn("MemberId")
.AsSet().Inverse().Cascade.AllDeleteOrphan();
另外,我认为你没有正确地使用property-ref,但这可能是因为你不恰当地映射了一对一