我有一个 Vessel 对象,它与 VesselDetail 对象。当我将 VesselDetail 对象添加到 Vessel 对象并尝试保存 Vessel 对象时,NHibernate 在插入 VesselDetail 对象时似乎没有添加外键。
我哪里错了?我就是想不通。
错误信息: BDN.FindVessel.Tests.Integration.NhibernateRepositoryTests.SaveVessel_ShouldAddDetailsToDb_WhenAddedToEntity: NHibernate.Exceptions.GenericADOException:无法插入:[BDN.FindVessel.Domain.VesselDetail][SQL:INSERT INTO BoatsDetails(SaftyGear、OtherMachineryAndGear、 Material 、尺寸、各种、TranslatorId、SpeenAndConsumption、MainMachinery、Created、Class、Capasities、Culture,内饰、电子、DeckGear) 值 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);选择 SCOPE_IDENTITY()] ----> System.Data.SqlClient.SqlException:无法将值 NULL 插入到列“BoatId”、表“FindVesselTest.dbo.BoatsDetails”中;列不允许空值。插入失败。 声明已终止。
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");
//...
}
}
最佳答案
似乎我缺少一些基本的 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();
}
}
关于NHibernate 一对多问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/555870/