gpt4 book ai didi

c# - (流利的)NHibernate : HasMany/References (bidirectional) + Cascade Save

转载 作者:行者123 更新时间:2023-11-30 21:59:57 31 4
gpt4 key购买 nike

X引用Y,Y有很多X的情况下如何配置双向映射,这样当我在Y实例中添加很多X并保存Y实例时,它会工作正常吗?

为了让问题更清楚,这里是代码:

ClientCompany 模型有HasMany ContactPerson 相关模型:

public class ClientCompany
{
// ....
public virtual ISet<ContactPerson> ContactPeople { get; set; }
}

// mapping:
HasMany(x => x.ContactPeople)
.AsSet()
.Inverse()
.Cascade.All();

ContactPerson 具有引用母公司的不可为空的“ClientCompany”字段:

public class ContactPerson
{
// ....
public virtual ClientCompany ClientCompany { get; set; }
}

References(x => x.ClientCompany).Not.Nullable();

调用这段代码:

sess.Save(new ClientCompany()
{
ContactPeople = new HashSet<ContactPerson>()
{
new ContactPerson()
}
});

导致此异常:

not-null property references a null or transient value xxxx.ContactPerson.ClientCompany

这只是一个简化的案例,我在我的真实项目中使用 AutoMapper,所以手动设置引用不是解决方案

最佳答案

ORM 世界中最重要的想法,即使用 NHibernate 时,是:

ALWAYS set both sides of relation.

这是有效的方式,如何设置两侧:

var person = new ContactPerson();
var company = new ClientCompany
{
ContactPeople = new HashSet<ContactPerson>()
{
person,
},
};
person.ClientCompany = company

sess.Save(company);

通过映射是声明为其关系负责的Person(反向映射.Inverse())。

这意味着它必须设置与其父项的关系。此关系稍后用于 INSERT 语句...并且它不能为空。

无需分别保存公司和个人。 唯一重要绝对重要的事情是设置两个引用边。这是必须的。

不确定你可以用自动映射器做什么......但是双向设置的某种包装/屏蔽可能是 POCO 对象上的一些特殊方法:

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;
}
}

现在我们只需要在正确的时间调用 AddPerson()...

关于c# - (流利的)NHibernate : HasMany/References (bidirectional) + Cascade Save,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28930240/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com