5

関連する 2 つのクラスを持つ単純な Fluent 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 を null に設定しようとするのはなぜですか? 私はこれで途方に暮れています。

4

1 に答える 1

13

に設定Applicant.Tagsすると、 InverseNHibernate にTagsの後に保存するように指示されますApplicant

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

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

もっと詳しく:

Inverse( ではなく.Not.Inverse()) は、関係の反対側 (この場合はそれぞれTag) が関係を維持する責任があることを意味します。したがって、NHibernateは、 がその の有効な外部キーを持つApplicantように、 を最初に保存する必要があることを認識しています。TagApplicant

経験則: 通常、外部キーを含むエンティティは所有者であるため、他のテーブルには所有者が必要です。Inverse

于 2012-06-26T18:15:44.137 に答える