2009-02-17 82 views
3

我有一個Vessel對象,它與一個對象爲一個對象的一對多關係。當我將VesselDetail對象添加到Vessel對象並嘗試保存Vessel對象時,似乎NHibernate在插入VesselDetail對象時不會添加外鍵。NHibernate一對多問題

我在哪裏錯了?我無法弄清楚。

錯誤消息: BDN.FindVessel.Tests.Integration.NhibernateRepositoryTests.SaveVessel_ShouldAddDetailsToDb_WhenAddedToEntity: NHibernate.Exceptions.GenericADOException:無法插入:[BDN.FindVessel.Domain.VesselDetail] [SQL:INSERT INTO BoatsDetails(SaftyGear,OtherMachineryAndGear ,材料,大小,各種,TranslatorId,SpeenAndConsumption,MainMachinery,創建,類,Capasities,文化,室內設計,電子,DeckGear)VALUES(?,?,?,?,?,? ,?,?,?,?);選擇SCOPE_IDENTITY()] ----> System.Data.SqlClient.SqlException:無法將值NULL插入到'BoatId'列中,表'FindVesselTest.dbo.BoatsDetails';列不允許有空值。 INSERT失敗。 該聲明已被終止。

public class Vessel 
{ 
     public virtual int BoatId { get; set; } 
     public virtual IList<VesselDetail> Details { get; set; } 
     //... 
} 

public class VesselDetail 
{ 
     public virtual int VesselDetailId { get; set; } 
     //some other properties 
     //.. 
} 

public class VesselMap: ClassMap<Vessel> 
{ 
    public VesselMap() 
    { 
     WithTable("Boats"); 

     Id(x => x.BoatId, "Id"); 

     //.. 

     HasMany(x => x.Details) 
      .WithKeyColumn("BoatId") //foreign key in the BoatsDetails table 
      .Cascade.All(); 
    } 
} 

public class VesselDetailMap:ClassMap<VesselDetail> 
{ 
    public VesselDetailMap() 
    { 
     WithTable("BoatsDetails"); 

     Id(x => x.VesselDetailId, "Id"); 

     //... 
    } 
} 

回答

10

看來我缺少一些基本的NHibernate技能。讀一點點看起來你需要讓子對象負責一對多的關係。

這個固定的問題對我來說:

public class VesselMap: ClassMap<Vessel> 
{ 
    public VesselMap() 
    { 
     //... 

     HasMany(x => x.Details) 
       .Inverse() 
       .WithKeyColumn("BoatId"); 
    } 
} 

public class VesselDetailMap:ClassMap<VesselDetail> 
{ 
    public VesselDetailMap() 
    { 
     //.. 

     References(x => x.Vessel, "BoatId") 
       .Cascade 
       .SaveUpdate(); 
    } 
} 
+0

upvoted張貼你如何解決:)謝謝你的問題! – Almond 2009-02-17 20:53:25