Свободное владение nHibernate - отображение детей с помощью составных ключей, дающих нулевые ссылки - PullRequest
3 голосов
/ 05 мая 2011

Учитывая простую настройку parent -> child (CK, CK), как это .. У меня проблемы с добавлением нового дочернего объекта и получением родительской ссылки.Поэтому я бы добавил объект таким способом ..

var parent = new Parent{
  Children = new List<Child>{
   new Child{
     Other = otherReference
   }
  }
};

Или даже добавив его, используя метод Add() ...

parent.Children.Add (newChild {Other = other});

Ссылка на Parent не передается.Это просто заканчивается как нулевое свойство.Я получаю следующее исключение.

{"Невозможно вставить значение NULL в столбец 'ParentId', таблица 'mssql_test.Children'; столбец не допускает нулевые значения. INSERT завершается ошибкой. \ R \ nУсловиебыл прерван. "}

Я могу сделать это ...

new Child { 
   Parent = parentReference,
   Other = otherReference
}

Но это кажется немного избыточным.Насколько я понимаю, он должен быть в состоянии вывести ссылку самостоятельно.Если это невозможно, возможно, я просто недоразумение.Может кто-нибудь мне помочь?У меня есть схема моего кода ниже.

Классы

class Parent {
  int Id { get; set; }
  IList<Child> Children { get; set; }
}
class Other {
  int Id { get; set; }
}
class Child {
  Parent Parent { get; set; }
  Other Other { get; set; }
  // other properties
}

Отображение

 ChildMap() {
      CompositeId()
        .KeyReference(x => x.Parent, "ParentId")
        .KeyReference(x => x.Other, "OtherId");
    }

    ParentMap(){
     HasManyToMany(x => x.Children)
                    .AsBag()
                    .ChildKeyColumns.Add(new[] { "ParentId", "OtherId" })
                    .Inverse()
                    .Cascade.All())
                    .Table("[Test]");
}

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Как указывает @KeithS, проблема состоит в том, что вы сопоставили коллекцию Child с HasManyToMany, когда она должна быть HasMany. Вот как должно выглядеть отображение:

  ChildMap() {
      CompositeId() //This is is good
        .KeyReference(x => x.Parent, "ParentId")
        .KeyReference(x => x.Other, "OtherId");
  }

  ParentMap(){ //This is the fix
        HasMany(c => c.Children)
          .Inverse()
          .Cascade.All()
          .KeyColumn("ParentId") //Not needed if Parent Id prop maps to ParentId col
          .Table("[Test]");
  }
0 голосов
/ 05 мая 2011

Вы не отображаете Родителя как собственность Ребенка.NHibernate (и FluentNH) отображают только то, что вы им говорите;у вас может быть дюжина полей на вашем объекте, но если вы отобразите только одно из них, это все, что NH предоставит, когда будет гидрировать экземпляр для вас.Вы должны включить метод «References» в Parent в ваше отображение, указав ключевое поле Parent в качестве ссылки FK.Это должно дать вам «обратную ссылку», которую вы имеете в вашей иерархии объектов.

Кроме того, похоже, что вместо «многие ко многим» на родительской стороне у вас должна быть только одна ко многимиспользуя HasMany).У родителей может быть много детей, но у ребенка есть один и только один родитель.ManyToMany может работать, но создает избыточную таблицу перекрестных ссылок между родителем и ребенком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...