2009-02-17 86 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