连贯NHibernate一个一对多的关系设定外键为空(Fluent NHibernate one-t

2019-07-30 03:11发布

我有两个相关类的简单功能NHibernate的模型:

public class Applicant
    {
        public Applicant()
        {
            Tags = new List<Tag>();
        }

        public virtual int Id { get; set; }

        //other fields removed for sake of example

        public virtual IList<Tag> Tags { get; protected set; }

        public virtual void AddTag(Tag tag)
        {
            tag.Applicant = this;
            Tags.Add(tag);
        }
    }


public class Tag
{
    public virtual int Id { get; protected set; }
    public virtual string TagName { get; set; }

    public virtual Applicant Applicant { get; set; }
}

我流利的映射如下:

public class ApplicantMap : ClassMap<Applicant>
    {
        public ApplicantMap()
        {
            Id(x => x.Id);

            HasMany(x => x.Tags).Cascade.All();
        }
    }

    public class TagMap : ClassMap<Tag>
    {
        public TagMap()
        {
            Id(x => x.Id);
            Map(x => x.TagName);

            References(x => x.Applicant).Not.Nullable();
        }
    }

每当我尝试更新的申请人(或插入一个新的正常工作),失败,我看到在日志下面的SQL异常:

11:50:52.695 [6] DEBUG NHibernate.SQL - UPDATE [Tag] SET Applicant_id = null WHERE Applicant_id = @p0;@p0 = 37 [Type: Int32 (0)] 
11:50:52.699 [6] ERROR NHibernate.AdoNet.AbstractBatcher - Could not execute command: UPDATE [Tag] SET Applicant_id = null WHERE Applicant_id = @p0 System.Data.SqlClient.SqlException (0x80131904): Cannot insert the value NULL into column 'Applicant_id', table 'RecruitmentApp.dbo.Tag'; column does not allow nulls. UPDATE fails.

为什么NHibernate的尝试更新标签表,并设置Applicant_id为空? 我在这一个损失。

Answer 1:

设置Applicant.TagsInverse将指示NHibernate的保存TagsApplicant

public class ApplicantMap : ClassMap<Applicant>
{
    public ApplicantMap()
    {
        Id(x => x.Id);

        HasMany(x => x.Tags).Cascade.All().Inverse();
    }
}

更多详情:

Inverse (相对于.Not.Inverse()指的关系的另一侧(在此情况下,每个Tag )是负责维护的关系。 因此,NHibernate的知道, Applicant这样就必须先保存Tag具有其有效的外键Applicant

经验法则:包含外键的实体,通常是主人,所以其他的表应该有Inverse



文章来源: Fluent NHibernate one-to-many relationship setting foreign key to null