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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top