2009-04-29 3 views
10

Ich habe eine N-Tier-Lösung erstellt, wo ich verwandte Daten aus einem WCF-Service abrufen, in einer Windows Forms-Anwendung aktualisieren und dann die aktualisierten Daten per WCF an die Datenbank weiterleiten . Die Anwendung, der WCF-Dienst und die Datenbank befinden sich alle auf verschiedenen Computern.Entity Framework, WCF und Updates

Die Daten bestehen Objekte eines Objekts und Kind abgerufen werden ...

public Product Select(string catalogueNumber) { 

    return (from p in this.ProductEntities.Products.Include(@"Tracks") 
      where p.vcCatalogueNumber == catalogueNumber 
      select p).FirstOrDefault() ?? new Product(); 
} 

Das Updates von der Client-Anwendung angewandt werden kann, sowie vorhandene Inhalte zu aktualisieren, auch zusätzliche „Track“ Objekte einfügen.

Wenn ich das Product-Objekt zurück von der Client-Anwendung erhalten, kann ich alle Updates richtig, aber zu sparen, um alle Änderungen korrekt Ich habe zu springen durch ein paar Reifen sehen ...

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

} 

Sicherlich muss es einen einfacheren Weg geben, dies zu tun?

Hinweis: Ich habe den größten Teil des Nachmittags damit verbracht, das EntityBag-Projekt zu untersuchen, habe aber festgestellt, dass dieses nicht aktualisiert wurde, um mit EF RTM zu funktionieren. Während die vorhandenen Daten erfolgreich aktualisiert werden, werden beim Hinzufügen neuer Objekte Ausnahmen ausgelöst.

Antwort

3

Ich habe keine fertige Antwort für Ihr spezielles Szenario - aber nur eine Frage: haben Sie ADO.NET Data Services (f.k.a. "Astoria") ausgecheckt?

Sie sind auf Entity Framework, WCF RESTful Schnittstelle gebaut, und sie bieten eine Client-Side-Erfahrung, und sie scheinen auch eine anständige Geschichte für nicht nur Abfragen, sondern auch das Aktualisieren, Einfügen von Datensätzen in Datenbanken.

Könnte dies eine Option sein?

überprüfen sie heraus auf MSDN, bei David Hayden's blog, auf Channel9 oder einige der hervorragenden Sitzungen MIX08 and MIX 09

Marc siehe

+0

Dies ist wahrscheinlich etwas, das ich in aussehen sollte, aber noch habe ich nicht . Leider haben wir erst kürzlich mit EF & WCF begonnen, wo ich arbeite, und Astoria ist derzeit nur ein weiterer Punkt auf der Liste der neuen Technologien, die untersucht werden sollen. Vielen Dank. –

+0

Ich bin endlich dazu gekommen, das zu betrachten (hauptsächlich, weil ich angefangen habe, mit Silverlight zu spielen) und tatsächlich denke ich, dass es die Antwort ist, nach der ich gesucht habe. –

0

Eine der Einschränkungen von Entity Framework v1.0 ist das Aktualisieren von Entitäten. Leider glaube ich, dass du Pech hast, bis Version 2 kommt.

3

Sie sollten wahrscheinlich einen Blick auf Danny Simmons' EntityBag Probe nehmen.

Es wurde entwickelt, um diese Art von Fragen zu vereinfachen: http://code.msdn.microsoft.com/entitybag/

Wie Catz sagt die Dinge viel einfacher in .NET 4.0 sein.

Eines der Dinge, die wir tun möchten, ist die Erstellung einer T4-Vorlage für Sie, die Klassen für Sie generiert, die sich selbst nachverfolgen können, und eine zusätzliche Oberfläche, damit diese Self-Tracking-Entitäten es einfacher machen Wenden Sie ApplyChanges() auf den Kontext an, wenn sie zur Serverebene zurückkehren.

this helps

Prost Alex (PM auf dem Entity Framework-Team bei Microsoft).

+0

Ja und du bekommst +2 Stimmen dafür, dem Typen zu sagen, was ich gerade gesagt habe! :) – mhenrixon

+0

Ich habe bereits EntityBag versucht und festgestellt, dass es nicht tun würde, was ich wollte. Google-Ergebnisse zeigen an, dass EntityBag nicht mit EF/RTM funktioniert, aber es ist genauso wahrscheinlich, dass ich es falsch machen könnte - so oder so, ich habe viele Ausnahmen beim Versuch, mein Elternobjekt zu aktualisieren, wenn es auch Updates und Ergänzungen enthielt die untergeordnete Objektsammlung. Danke trotzdem! –

1

Ich sehe, dass dieser Thread ruhig gefolgt ist, also erlaube ich mir ein kleines Update ...

Weeeeee! Self-Tracking-Entitäten sind in EF 4 angekommen!

Check this out:

http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
Erklärung des Selbst Tracking-Mechanismus durch das Team Entity Framework.

http://aleembawany.com/2009/05/17/new-features-in-entity-framework-40-v2/
Anouncement der neuen Funktionen in EF 4.

http://msdn.microsoft.com/en-us/magazine/ee321569.aspx
Vergleich mehrerer N-Tier-Muster für getrennte Einheiten.

Viel Spaß!

1

In Entity Framewrok 4 können Sie die Methode "ApplyCurrentValues" verwenden, um eine gelöste Entität zu aktualisieren.

In Ihrem Szenario wird so etwas wie dieses:

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

}

Ich hoffe, dass es

nützlich sein wird