【问题标题】:NHibernate one-to-many problemNHibernate 一对多问题
【发布时间】:2009-02-17 08:06:39
【问题描述】:

我有一个 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、材料、尺寸、各种、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 fluent-nhibernate


    【解决方案1】:

    似乎我缺少一些基本的 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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多