2010-05-26 12 views
1

Je souhaite suivre une liste d'objets racine qui ne sont pas contenus par un élément. Je veux que le pseudo-code suivant au travail:NHibernate: Collection racine avec un objet racine

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); 
} 

Cela devrait insérer automatiquement Item1 et item2, supprimer item3 et item3 et mettre à jour item5 (c.-à-je ne veux pas appeler sesssion.SaveOrUpdate() pour tous les éléments séparément.

est-il possible de définir une entité pseudo qui n'est pas associée à une table par exemple, je veux définir les propriétés de collection favoris de la classe et la carte 2 de celui-ci et que je veux écrire du code comme ceci:

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

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

FavoriteCoulors et FavoriteMovies sont les seules propriétés de la classe Favorites et sont de type IList et IList. Je veux seulement persister ces deux propriétés de collection mais pas la classe de favoris. En fait, je veux un objet IPersistentCollection qui suit ajoute et supprime qui n'appartient à aucune entité parente et qui lui-même (ce qui arrive aux propriétés de collection des entités, seulement dans mon cas je n'ai pas d'entité parente). Cela fonctionne parfaitement bien si les collections appartiennent à une entité auquel cas je peux ajouter et supprimer des éléments entre deux sessions.

Toute aide est très appréciée.

+1

L'exigence selon laquelle il doit fonctionner entre les sessions n'est pas claire d'après votre question. Vous devriez ajouter ceci (et d'autres exigences cachées) à votre question pour éviter que les gens passent du temps à donner des réponses inutiles à une question incomplète. –

Répondre

0

Je n'ai toujours pas trouvé une vraie solution à ce problème. Mon travail autour jusqu'à présent est que j'ai ajouté la collection en tant que propriété de collection enfant à une autre entité à partir de laquelle une seule instance existe jusqu'à présent. Mais cette solution casse s'il y aura plus d'instances de cette entité et elle présente l'inconvénient que la version de celle-ci est incrémentée chaque fois qu'un élément est ajouté ou supprimé.

L'autre travail aurait consisté à créer une pseudo-entité sans propriétés/colonnes (sauf un ID).

La troisième alternative que je pourrais penser est de recréer la collection entière chaque fois qui est assez lente et ne fonctionne pas si d'autres entités référencent l'un des articles.

La dernière solution consisterait à réimplémenter moi-même la fonctionnalité de vérification encrassée, mais cela ajouterait de la complexité et de la duplication de code.

Si quelqu'un connaît de meilleures alternatives, je serais heureux de recevoir des commentaires.

0

Une solution plus simple qu'une pseudo-entité serait d'envelopper la liste dans un objet qui gère les choses que vous voulez.

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

Mais cela ne fonctionne pas si le chargement et l'enregistrement se produisent dans deux sessions différentes et que les ajouts et suppressions se produisent entre ces sessions. En fait, je veux un objet IPersistentCollection qui suit et supprime qui n'appartient à aucune entité parente et qui est lui-même (ce qui arrive aux propriétés de collection d'entités, seulement dans mon cas je n'ai pas d'entité parent). Cela fonctionne parfaitement bien si les collections appartiennent à une entité auquel cas je peux ajouter et supprimer des éléments entre deux sessions. – Daniel