Question

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

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, supprimez item3 et item3 et mettre à jour item5 (à savoir que 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 favoris de la classe et la carte 2 propriétés de collecte et de 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);  
}

FavoriteColors et FavoriteMovies sont les seules propriétés de la classe Favoris et sont de type IList et IList. Je ne veux que pour conserver les ces deux propriétés de collection, mais pas la classe Favoris.

En fait, je veux un objet IPersistentCollection que les pistes ajoute et supprime appartenant à aucune entité mère et se tient lui-même (la même chose qui se produit aux propriétés de collecte d'entités, que dans mon cas, je ne l'entité mère). Cela fonctionne parfaitement si les collections appartiennent à une entité dans ce cas, je peux ajouter et supprimer des éléments entre deux sessions.

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

Était-ce utile?

La solution 2

Je n'ai toujours pas trouvé une vraie solution à ce problème. Mon travail autour de ce jour est que j'ai ajouté la collection comme une propriété de collection enfant à une autre entité dont une seule instance existe jusqu'à présent. Mais cette pause de solution s'il y aura plus de cas de cette entité et il a l'inconvénient que la version de celui-ci est incrémenté à chaque fois qu'un élément est ajouté ou supprimé.

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

La troisième solution que je pouvais penser est de recréer toute la collection à chaque fois que ce qui est assez lent et ne fonctionne pas si d'autres entités font référence à l'un des éléments.

La dernière alternative serait de ré-implémenter la fonctionnalité de contrôle de moi-même sale, mais cela ajouterait une certaine duplication de la complexité et le code.

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

Autres conseils

Une solution plus simple qu'une entité pseudo 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();
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top