5

ich ein einfaches Fluent NHibernate Modell mit zwei verwandten Klassen haben:Fluent NHibernate eine Eins-zu-viele-Beziehung Fremdschlüssel Einstellung auf null

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; } 
} 

Meine fließend Mapping ist die folgende:

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(); 
     } 
    } 

Wann immer Ich versuche update ein Bewerber (ein neues einfügt, funktioniert gut), es schlägt fehl und ich sehe die folgende SQL-Ausnahme in den Protokollen:

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. 

Warum versucht NHibernate, die Tag-Tabelle zu aktualisieren und Applicant_id auf null zu setzen? Ich bin ratlos.

Antwort

13

Set Applicant.Tags zu Inverse wird NHibernate anweisen, Tags nach der Applicant zu speichern.

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

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

Weitere Einzelheiten:

Inverse (im Gegensatz zu .Not.Inverse() gegen) bedeutet, die andere Seite der Beziehung (in diesem Fall ist jeder Tag) ist verantwortlich für die Beziehung aufrechterhalten wird. Daher weiß NHibernate, dass die Applicant zuerst gespeichert werden muss, damit Tag einen gültigen Fremdschlüssel für seine Applicant hat.

Daumenregel: Das Unternehmen mit dem Fremdschlüssel ist in der Regel der Eigentümer, so sollte die andere Tabelle hat Inverse

+0

wie ein Charme. Vielen Dank! Ich bin immer noch ein wenig verwirrt, was inverse bedeutet, aber ich werde ein wenig lesen. Ich sehe es jedoch nicht in der Dokumentation. – arknotts

+0

Vielen Dank für die Lösung des Problems, es funktionierte ohne Probleme. – Desmond