2010-05-26 4 views
1

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

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

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

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

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

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

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

+1

Требование, чтобы оно работало между сеансами, не ясно из вашего вопроса. Вы должны добавить этот (и другие скрытые требования) к своему вопросу, чтобы избежать того, чтобы люди тратили время, давая бесполезные ответы на неполный вопрос. –

ответ

0

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

Другая работа вокруг была бы для создания псевдообъекта без свойств/столбцов (кроме идентификатора).

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

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

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

0

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

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(); 
    } 
} 
+0

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