NHibernate проблема один ко многим - PullRequest
3 голосов
/ 17 февраля 2009

У меня есть объект 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, SpeenAndConsitation, Основное, Класс, Учебное заведение, Учреждение) Интерьер, электроника, 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");

      //...
  }
}

1 Ответ

10 голосов
/ 17 февраля 2009

Кажется, мне не хватало фундаментальных навыков 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...