NHibernate: Корневая коллекция с корневым объектом

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

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 () для всех элементов отдельно.

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

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, который отслеживает добавление и удаление, которое не принадлежит ни одной родительской сущности и означает саму себя (то же самое, что происходит со свойствами коллекции сущностей, только в моем случае у меня нет родительской сущности). Это отлично работает, если коллекции принадлежат объекту, и в этом случае я могу добавлять и удалять элементы между двумя сеансами.

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


person Daniel    schedule 26.05.2010    source источник
comment
Требование, чтобы он работал между сеансами, не ясно из вашего вопроса. Вы должны добавить это (и другие скрытые требования) к своему вопросу, чтобы люди не тратили время на бесполезные ответы на неполный вопрос.   -  person Jan Willem B    schedule 27.05.2010


Ответы (2)


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

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();
  }
}
person Jan Willem B    schedule 26.05.2010
comment
Но это не сработает, если загрузка и сохранение происходят в двух разных сеансах, а добавление и удаление происходит между этими сеансами. На самом деле мне нужен объект IPersistentCollection, который отслеживает добавление и удаление, которое не принадлежит ни одной родительской сущности и означает саму себя (то же самое, что происходит со свойствами коллекции сущностей, только в моем случае у меня нет родительской сущности). Это отлично работает, если коллекции принадлежат объекту, и в этом случае я могу добавлять и удалять элементы между двумя сеансами. - person Daniel; 27.05.2010

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

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

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

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

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

person Daniel    schedule 03.06.2010