Обновить объект NHibernate дочерней коллекцией - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь обновить объект nHibernate дочерней коллекцией, используя метод .Update (), найденный в сеансе гибернации.Единственное, что я могу сделать с текущей настройкой, это добавить детей, я не могу их изменить или удалить.

Для пояснения объекты и их сопоставление выглядят следующим образом:

public class Parent {
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual ISet<Child> Children { get; set; } = new HashSet<Child>();
}

public class ParentMap: ClassMap<Parent>
{
   public ParentMap()
   {
     Id(x => x.Id);
     Map(x => x.Name);
     HasMany(x => x.Children)
       .AsSet()
       .Inverse()
       .Cascade.AllDeleteOrphan();
   }
}

public class Child {
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual Parent Parent { get; set; }
}

public class ChildMap: ClassMap<Child>
{
   public ChildMap()
   {
       Id(x => x.Id);
       Map(x => x.Name);
       References(x => x.Parent);        
   }
}

Когда я получаю изменения со своего уровня пользовательского интерфейса и пытаюсь обновить уже существующий объект, используя:

using (var tx = _session.BeginTransaction())
     _session.Update(newParent);
     tx.Commit();
}

Здесь newParent - это временный объект (полученный из базы данных в предыдущем сеансе и показанный в пользовательском интерфейсе), содержащий тот же идентификатор, что и объект, который я хотел бы обновить, но с изменениями в дочерней коллекции.Каким-то образом, используя этот подход, я могу только добавлять детей, но не изменять или удалять их.

Где моя ошибка?

1 Ответ

0 голосов
/ 20 октября 2018

Скорее всего, с вами происходит то, что вместо изменения набора, созданного NHibernate в вашей родительской сущности, вы заменяете его все вместе новым экземпляром HashSet.

Когда высохранить или получить объект из NHibernate, ваши Children ISet загружаются с экземпляром PersistentGenericSet (который реализует ISet), который отвечает за помощь в отслеживании этого изменения для вашей коллекции.

Короче говоря, не присваивайте детям свойство.На самом деле, сделать сеттер protected.Просто Add() или Remove() или Clear(), как требуется.

...