Nibernate: Коллекция корня с корневым объектом
-
04-10-2019 - |
Вопрос
Я хочу отследить список корневых объектов, которые не содержатся ни одного элемента. Я хочу работать следующий псевдо для работы:
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, удалить элемент3 и item3 и обновлять элемент5 (т.е. я не хочу звонить sesssionsion.saveorupdate () для всех предметов отдельно.
Можно ли определить псевдовязку, которая не связана со столом? Например, я хочу определить класс Favief и Map 2 Scilection его свойств и, чем я хочу написать код, как это:
using (session1 = [...]) {
var favs = session1.Linq<Favorites>();
}
favs.FavoriteColors.Add(new FavoriteColor(...));
favs.FavoriteMovies.Add(new FavoriteMovie(...));
using (session2 = [...]) {
session.SaveOrUpdate(favs);
}
FavoriteColors и Favoritemovies являются единственными свойствами класса избранного и имеют тип Ilist и Ilist. Я только хочу сохранить эти два недвижимости сбора, но не класс избранного.
На самом деле я хочу, чтобы объект IPERSISTENTCOLLECTORUCET, который треки добавляет и удаляет, что не принадлежит родительскому объекту и подписывается для себя (то же самое, что происходит с учетом свойств объектов, только в моем случае у меня нет родительского объекта). Это отлично работает хорошо, если коллекции принадлежат сущности, в этом случае я могу добавлять и удалять элементы между двумя сеансами.
Любая помощь горячо приветствуется.
Решение 2
Я до сих пор не нашел реального решения этой проблемы. Моя работа до сих пор до сих пор, что я добавил коллекцию в качестве имущества сбора ребенка в другой объект, из которого существует только один экземпляр. Но это решение разрывается, если будут больше экземпляров этого объекта, и у него есть недостаток, что версия его увеличивается каждый раз, когда элемент добавляется или удален.
Другая работа вокруг должна была бы создать псевдовязку без свойств / столбцов (кроме ID).
Третья альтернатива, которую я мог бы подумать о воссоздании всей коллекции каждый раз, что довольно медленно и не работает, если другие объекты ссылаются на один из предметов.
Последняя альтернатива будет переосмыслить грязную функциональность проверки самостоятельно, но это добавит некоторую сложность и дублирование кода.
Если кто-то знает лучшие альтернативы, я был бы рад за любые комментарии.
Другие советы
Упрощенное решение, чем Pseudo-объект, будет обернуть список в объекте, который управляет тому, что вы хотите.
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();
}
}