在将实体添加到一对多集合时,是否需要设置ONE侧的值?

时间:2013-03-25 18:14:25

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

这似乎是一个非常明显的问题,但我找不到明确的答案。 我正在使用FluentNHibernate自动化与DefaultCascade.All()约定。

实体正在保存,但在一对多的关系中,即使我通过添加到集合中进行保存,我也必须在多方面提供一方。 一个例子可能会更好地解释这个:

让我说我有这两个类:

public class Owner
{
    public virtual IList<PetDog> Dogs { get; set; }
}

public class PetDog
{
    public virtual Owner Owner { get; set; }
}

为了在主人的Dogs系列中添加新的PetDog,我觉得我应该可以打电话

Owner.Dogs.Add(new PetDog());

并处理我的ISession。但是,我只是让业主保存,就是这样。 如果我明确设置

Owner.Dogs.Add(new PetDog { Owner = Owner })

有效。

有没有办法避免明确提供该值?

1 个答案:

答案 0 :(得分:0)

这可以通过在Owner映射中设置inverse = false将Owner类标记为关系的所有者来完成,即

HasMany(x => x.Dogs)
    .Not.Inverse()
    .Cascade.AllDeleteOrphan();

然后,在提交时填充PetDog表中的owner_id外键,即

using (var transaction = session.BeginTransaction())
{
    var order = new Owner() {Dogs = new List<PetDog>()};
    order.Dogs.Add(new PetDog() );
    order.Dogs.Add(new PetDog() );

    session.Save(order);
    transaction.Commit();
}

或者,您可以调用session.Flush()而不是使用事务,这将导致新数据插入数据库,即

    var order = new Owner() {Dogs = new List<PetDog>()};
    order.Dogs.Add(new PetDog() );
    order.Dogs.Add(new PetDog() );

    session.Save(order);
    session.Flush(); // data persisted to DBMS here.

请注意,建议不要使用session.Flush()。建议使用显式事务。有关详细信息,请参阅Ayende Rahien的blog post