Entity Framework, WCF & amp; aggiornamenti
-
03-07-2019 - |
Domanda
Ho creato una soluzione di livello n in cui sto recuperando i dati correlati da un servizio WCF, aggiornandoli all'interno di un'applicazione Windows Form e quindi restituendo i dati aggiornati tramite WCF affinché vengano mantenuti nel database. L'applicazione, il servizio WCF e il database sono tutti su macchine diverse.
I dati recuperati sono costituiti da un oggetto e oggetti figlio ...
public Product Select(string catalogueNumber) {
return (from p in this.ProductEntities.Products.Include(@"Tracks")
where p.vcCatalogueNumber == catalogueNumber
select p).FirstOrDefault() ?? new Product();
}
Gli aggiornamenti applicati dall'applicazione client possono, oltre all'aggiornamento del contenuto esistente, inserire anche ulteriori "Traccia". oggetti.
Quando ricevo l'oggetto Product dall'applicazione client, posso vedere correttamente tutti gli aggiornamenti, tuttavia per salvare correttamente tutte le modifiche devo saltare alcuni cerchi ...
public void Save(Product product) {
Product original = this.Select(product.vcCatalogueNumber);
if (original.EntityKey != null) {
this.ProductEntities.ApplyPropertyChanges(product.EntityKey.EntitySetName, product);
// There must be a better way to sort out the child objects...
foreach (Track track in product.Tracks.ToList()) {
if (track.EntityKey == null) {
original.Tracks.Add(track);
}
else {
this.ProductEntities.ApplyPropertyChanges(track.EntityKey.EntitySetName, track);
}
}
}
else {
this.ProductEntities.AddToProducts(product);
}
this.ProductEntities.SaveChanges();
}
Sicuramente, ci deve essere un modo più semplice per farlo?
Nota: ho trascorso la maggior parte del pomeriggio a studiare il progetto EntityBag, ma ho scoperto che questo non è stato aggiornato per funzionare con EF RTM. In particolare, mentre aggiornerà con successo le eccezioni ai dati esistenti vengono generate quando si mescolano nuovi oggetti.
Soluzione
Non ho una risposta pronta per il tuo particolare scenario, ma solo una domanda: hai verificato ADO.NET Data Services (f.k.a. " Astoria ")?
Sono basati su Entity Framework, l'interfaccia RESTful di WCF e offrono un'esperienza lato client, inoltre sembrano avere una storia decente non solo per le query, ma anche per l'aggiornamento, l'inserimento di record nei database.
Potrebbe essere un'opzione?
Dai un'occhiata a MSDN , a Il blog di David Hayden , su Channel9 , o vedere alcuni degli eccellenti sessioni presso MIX08 e MIX 09
Marc
Altri suggerimenti
Probabilmente dovresti dare un'occhiata all'esempio EntityBag di Danny Simmons.
È progettato per semplificare questo tipo di problemi: http://code.msdn.microsoft.com/entitybag/
Come dice CatZ, le cose saranno molto più facili in .NET 4.0.
Una delle cose che stiamo pianificando di fare per aiutarti è la creazione di un modello T4 per te che generi classi per te in grado di auto-tracciamento e una superficie extra per rendere semplice applicare queste modifiche alle entità di auto-tracciamento () al contesto quando tornano al livello server.
Spero che questo aiuti
Saluti Alex (PM del team Entity Framework di Microsoft).
Vedo che questo thread è seguito silenziosamente, quindi mi permetto di fare un piccolo aggiornamento ...
Weeeeee! Le entità con auto-tracking sono arrivate in EF 4!
Dai un'occhiata:
http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
Spiegazione del meccanismo di auto-tracciamento da parte del team del framework dell'entità.
http: // aleembawany. com / 2009/05/17 / new-funzioni-in-entità-quadro-40-V2 /
Annuncio di nuove funzionalità in EF 4.
http://msdn.microsoft.com/en-us/magazine /ee321569.aspx
Confronto di diversi pattern di livello N per entità disconnesse.
Divertiti!
In Entity Framewrok 4 puoi utilizzare il metodo " ApplyCurrentValues ??" per aggiornare un'entità distaccata.
Nel tuo scenario sarà qualcosa del genere:
this.ProductEntities.Product.ApplyCurrentValues(product);
foreach (Track track in product.Tracks.ToList()) {
if (track.EntityKey != null)
{
//Update Entity
this.ProductEntities.Track.ApplyCurrentValues(track);
}
else
{
//New Entity
this.ProductEntities.Track.Attach(track);
}
}
Spero che sia utile
Una delle limitazioni di Entity Framework v1.0 è l'aggiornamento delle entità. Purtroppo penso che tu sia sfortunato fino all'arrivo della versione 2.