1

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

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

假设我有这两个类:

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

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

为了将新的 PetDog 添加到所有者的 Dogs 集合中,我觉得我应该可以调用

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

并处置我的 ISession。但是,我只是让所有者节省,仅此而已。如果我明确设置

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

有用。

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

4

1 回答 1

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 的这篇博文。

于 2013-03-25T19:22:59.887 回答