NHibernate: корневая коллекция с корневым объектом - PullRequest
1 голос
/ 26 мая 2010

Я хочу отслеживать список корневых объектов, которые не содержатся ни в одном элементе. Я хочу, чтобы следующий псевдокод работал:

using (session1 = [...]) {
  IList<FavoriteItem>list = session1.Linq<FavoriteItem>().ToList();
}

list.Add(item1);
list.Add(item2);
list.Remove(item3);
list.Remove(item4);
var item5 = list.First(i => i.Name = "Foo");
item5.Name = "Bar";

using (session2 = [...]) {
  session2.Save(list);
}

Это должно автоматически вставить item1 и item2, удалить item3 и item3 и обновить item5 (т.е. я не хочу вызывать sesssion.SaveOrUpdate () для всех элементов отдельно.

Можно ли определить псевдо-сущность, которая не связана с таблицей? Например, я хочу определить класс Favorites и сопоставить его со свойствами коллекции 2, а затем написать код, подобный следующему:

using (session1 = [...]) {
   var favs = session1.Linq<Favorites>();
}
favs.FavoriteColors.Add(new FavoriteColor(...));
favs.FavoriteMovies.Add(new FavoriteMovie(...));

 using (session2 = [...]) {
  session.SaveOrUpdate(favs);  
}

FavoriteColors и FavoriteMovies являются единственными свойствами класса Favorites и имеют типы IList и IList. Я хочу сохранить только эти два свойства коллекции, но не класс «Избранное».

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

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 03 июня 2010

Я до сих пор не нашел реального решения этой проблемы. До сих пор моя работа заключалась в том, что я добавил коллекцию как дочернее свойство коллекции к другому объекту, из которого до сих пор существует только один экземпляр. Но это решение ломается, если будет больше экземпляров этой сущности, и его недостатком является то, что его версия увеличивается каждый раз, когда элемент добавляется или удаляется.

Другой обходной путь - создание псевдо-сущности без свойств / столбцов (кроме идентификатора).

Третья альтернатива, о которой я мог подумать, - это воссоздание всей коллекции каждый раз, что довольно медленно и не работает, если другие объекты ссылаются на один из элементов.

Последней альтернативой было бы переопределить функцию грязной проверки, но это добавило бы некоторую сложность и дублирование кода.

Если кто-то знает лучшие альтернативы, я буду рад любым комментариям.

0 голосов
/ 26 мая 2010

Более простым решением, чем псевдо-сущность, было бы заключить список в объект, управляющий нужными вам вещами.

public class FavoriteList : IEnumerable
{
  private List<FavoriteItem> list;
  private ISession session;
  public FavoriteList(ISession session) 
  {
    list = session.Linq<FavoriteItem>().ToList();
    this.session = session;
  }

  public void Add(FavoriteItem item)
  {
    session.SaveOrUpdate(item); 
    list.Add(item);
  }

  public void Remove(FavoriteItem item)
  {
     session.Delete(item); //or something like that
     list.Remove(item);
  }

  public IEnumerator GetEnumerator()
  {
     return (list as IEnumerable).GetEnumerator();
  }
}
...