Entity Framework 4, oggetti POCO e ASP.Net MVC2. Ho una relazione molti a molti, diciamo tra BlogPost e le entità Tag. Ciò significa che nella mia classe POCO BlogPost generata da T4 ho:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Chiedo un BlogPost e i relativi tag da un'istanza di ObjectContext e lo invio a un altro livello (Visualizza nell'applicazione MVC). Successivamente ricevo il BlogPost aggiornato con proprietà modificate e relazioni modificate. Ad esempio, aveva i tag "A" "B" e "C" e i nuovi tag sono "C" e "D". Nel mio esempio particolare non ci sono nuovi tag e le proprietà dei tag non cambiano mai, quindi l'unica cosa che dovrebbe essere salvata sono le relazioni modificate. Ora ho bisogno di salvarlo in un altro ObjectContext. (Aggiornamento: ora ho provato a fare nella stessa istanza di contesto e anche non è riuscito.)
Il problema: non riesco a salvare le relazioni correttamente. Ho provato tutto quello che ho trovato:
- Controller.UpdateModel e Controller.TryUpdateModel non funzionano.
- Ottenere il vecchio BlogPost dal contesto e quindi modificare la raccolta non funziona. (con metodi diversi dal punto successivo)
- Questo probabilmente avrebbe funzionato, ma spero che questo è solo una soluzione, non la soluzione :(.
- Ho provato le funzioni Allega / Aggiungi / Modifica Stato oggetto per BlogPost e / o Tag in tutte le possibili combinazioni. Impossibile.
- Questo assomiglia a quello che mi serve, ma non funziona (ho cercato di risolvere il problema, ma non può per il mio problema).
- Ho provato ChangeState / Add / Attach / ... gli oggetti di relazione del contesto. Impossibile.
"Non funziona" significa nella maggior parte dei casi che ho lavorato sulla "soluzione" data fino a quando non produce errori e salva almeno le proprietà di BlogPost. Quello che succede con le relazioni varia: normalmente i Tag vengono aggiunti di nuovo alla tabella Tag con nuovi PK e il BlogPost salvato fa riferimento a quelli e non a quelli originali. Ovviamente i tag restituiti hanno PK, e prima dei metodi di salvataggio / aggiornamento controllo i PK e sono uguali a quelli nel database, quindi probabilmente EF pensa che siano nuovi oggetti e quei PK sono quelli temporanei.
Un problema che conosco e che potrebbe rendere impossibile trovare una soluzione semplice automatizzata: quando la raccolta di un oggetto POCO viene modificata, ciò dovrebbe accadere per la proprietà della raccolta virtuale sopra menzionata, perché quindi il trucco FixupCollection aggiornerà i riferimenti inversi dall'altra parte della relazione molti-a-molti. Tuttavia, quando una vista "restituisce" un oggetto BlogPost aggiornato, ciò non è accaduto. Ciò significa che forse non esiste una soluzione semplice al mio problema, ma ciò mi renderebbe molto triste e odierei il trionfo di EF4-POCO-MVC :(. Inoltre ciò significherebbe che EF non può farlo nell'ambiente MVC a seconda di quale Vengono utilizzati i tipi di oggetto EF4 :(. Penso che il rilevamento delle modifiche basato su snapshot dovrebbe scoprire che il BlogPost modificato ha relazioni con i tag con PK esistenti.
A proposito: penso che lo stesso problema si verifichi con le relazioni uno-a-molti (Google e il mio collega lo dicono). Lo proverò a casa, ma anche se funziona, non mi aiuta nelle mie sei relazioni molti-a-molti nella mia app :(.