ObjectDeletedException:为什么NHibernate不能自动打破关联

本文关键字:关联 不能 为什么 NHibernate ObjectDeletedException | 更新日期: 2023-09-27 17:54:05

我有一个一对一的映射,我试图用流利的NHibernate映射来表达。我知道网上有很多类似的问题/答案,但几个小时后,我很难找到我的具体问题的答案。

我有一个MemberSubscription对象。一个成员可以有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的关联?

ObjectDeletedException:为什么NHibernate不能自动打破关联

这里的基本问题是,这不是一个一对一的关系,而是一个一对多的关系,其中多侧被限制为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,但这可能是因为你不恰当地映射了一对一