Domanda

Voglio tenere traccia di un elenco di oggetti radice che non rientri da alcun elemento. Voglio il seguente pseudo codice al lavoro:

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

Questo dovrebbe automaticamente inserto item1 e item2, eliminare item3 e item3 e aggiornare item5 (vale a dire che non voglio chiamare sesssion.SaveOrUpdate () per tutte le voci separatamente.

E 'possibile definire un'entità pseudo che non è associato con un tavolo? Per esempio voglio definire i preferiti di classe e mappare 2 proprietà di raccolta di esso e poi voglio scrivere il codice in questo modo:

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

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

FavoriteColors e FavoriteMovies sono le uniche proprietà della classe Preferiti e sono di tipo IList e IList. Faccio solo voglia di persistere le queste due proprietà di raccolta, ma non la classe Preferiti.

In realtà io voglio un oggetto IPersistentCollection che aggiunge e rimuove le tracce che appartiene a nessuna entità genitore e sta per sé (la stessa roba che accade alle proprietà di raccolta di entità, solo nel mio caso non ho controllante). Questo funziona perfettamente bene se le collezioni appartengono ad un'entità nella quale caso posso aggiungere e rimuovere elementi tra le due sessioni.

Ogni aiuto è molto apprezzato.

È stato utile?

Soluzione 2

non ho ancora trovato una vera soluzione a questo problema. Il mio lavoro intorno finora è che ho aggiunto la collezione come una proprietà della raccolta bambino ad un'altra entità da cui esiste una sola istanza finora. Ma questa soluzione si rompe se non ci saranno più istanze di questa entità e ha lo svantaggio che la versione di esso viene incrementato ogni volta che un elemento viene aggiunto o rimosso.

L'altra opera intorno sarebbe stata quella di creare un'entità pseudo con immobili / colonne (ad eccezione di un ID).

La terza alternativa mi veniva in mente è ricreare l'intera collezione ogni volta che è abbastanza lento e non funziona se altre entità fanno riferimento una delle voci.

L'ultima alternativa sarebbe quella di reimplementare la funzionalità di controllo sporca me stesso, ma questo sarebbe aggiungere una certa complessità e la duplicazione del codice.

Se qualcuno conosce alternative migliori che sarà felice per eventuali commenti.

Altri suggerimenti

Una soluzione più semplice di un'entità pseudo sarebbe quella di avvolgere la lista in un oggetto che gestisce le cose che vuoi.

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();
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top