1

我有一个一对一的映射,我试图用 Fluent 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.
  • 删除 aSubscription会破坏 上的关联Member
  • 删除 aSubscription不会删除Member.

如果我将 Cascade 设置MemberSubscription已保存,但删除 aSubscription会引发ObjectDeletedException.

Subscription为什么 NHibernate在应用级联之前不能自动删除关联到first Member

4

1 回答 1

2

这里的基本问题是,这不是一对一关系,而是一对多,多方限制为 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 ,但这可能是因为您不恰当地进行了一对一的映射。

于 2013-01-18T12:58:02.980 回答