这似乎是一个非常明显的问题,但我找不到明确的答案。 我正在使用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 })
有效。
有没有办法避免明确提供该值?
答案 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。