C# (流利)NHibernate:有许多/参考(双向)和#x2B;级联保存
在X引用Y的场景中,如何配置双向映射的映射,Y有许多X,这样当我向Y实例添加许多X并保存Y实例时,它将正常工作 为了明确问题,下面是代码: ClientCompany模型有很多相关模型:C# (流利)NHibernate:有许多/参考(双向)和#x2B;级联保存,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,在X引用Y的场景中,如何配置双向映射的映射,Y有许多X,这样当我向Y实例添加许多X并保存Y实例时,它将正常工作 为了明确问题,下面是代码: ClientCompany模型有很多相关模型: public class ClientCompany { // .... public virtual ISet<ContactPerson> ContactPeople { get; set; } } // mapping: HasMany(x => x.ContactP
public class ClientCompany
{
// ....
public virtual ISet<ContactPerson> ContactPeople { get; set; }
}
// mapping:
HasMany(x => x.ContactPeople)
.AsSet()
.Inverse()
.Cascade.All();
调用此代码:
sess.Save(new ClientCompany()
{
ContactPeople = new HashSet<ContactPerson>()
{
new ContactPerson()
}
});
sess.Save(新客户公司()
{
ContactPeople=newhashset()
{
新联系人()
}
});
导致此异常的原因:
not null属性引用null或瞬态值
xxxx.ContactPerson.ClientCompany
这只是一个简单的例子,我在现实世界的项目中使用AutoMapper,因此手动设置参考值是而不是解决方案ORM世界中最重要的想法,即使用NHibernate时,是: 始终设置关系的两个方面 这是有效的方法,如何设置双方:
var person = new ContactPerson();
var company = new ClientCompany
{
ContactPeople = new HashSet<ContactPerson>()
{
person,
},
};
person.ClientCompany = company
sess.Save(company);
现在我们只需在适当的时间调用
AddPerson()
。谢谢!我想我可以让它在“company”对象上调用“Save”时自动设置引用。通过这种方式,可以让自动映射器发挥神奇的作用。必须显式设置引用。这真的很关键。如果你这样做,剩下的将由NHibernate处理。。。另一种方法(但我不确定您的自动映射器能够做什么)是创建特殊的方法AddPerson()
,并在那里实现双向设置(父到子、子到父)。。。但是AutoMapper必须能够调用这样的方法AddPerson()
var person = new ContactPerson();
var company = new ClientCompany
{
ContactPeople = new HashSet<ContactPerson>()
{
person,
},
};
person.ClientCompany = company
sess.Save(company);
public class ClientCompany
{
// ....
public virtual ISet<ContactPerson> ContactPeople { get; set; }
public virtual AddPerson(ContactPerson person)
{
ContactPeople = ContactPeople ?? new HashSet<ContactPerson>();
ContactPeople.Add(person);
person.ClientCompany = this;
}
}