5

我有一個簡單的功能NHibernate的模型有兩個相關的類:流利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?我在這一個上虧本。

回答

13

設置爲Applicant.TagsInverse將指示NHibernate在Applicant之後保存Tags

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

+0

工作就像一個魅力。謝謝!我仍然對反意味着什麼感到困惑,但我會稍微閱讀一下。儘管我沒有在文檔中看到它。 – arknotts

+0

非常感謝您解決無任何問題的問題。 – Desmond

相關問題