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

相关问题