繁体   English   中英

(流畅)NHibernate:HasMany /参考(双向)+级联保存

[英](Fluent) NHibernate: HasMany/References (bidirectional) + Cascade Save

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属性引用的是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);

通过映射被声明为负责其关系的Person (逆映射.Inverse() )。

这意味着,它必须已将关系设置为其父级。 以后将这个关系用于INSERT语句...,并且不能为null。

无需分别保存公司和人员。 唯一必要绝对重要的是设置两个参考面。 那是必须的。

不确定如何使用自动映射器...但是双向包装的某种包装/屏蔽可能是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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM