Frage

Ich habe eine n-Tier-Lösung geschaffen, in dem ich die zugehörigen Daten aus einem WCF-Dienst am abrufen, es in einem Windows Forms-Anwendung zu aktualisieren, und dann die aktualisierten Daten über WCF Rückkehr in die Datenbank beibehalten werden. Die Anwendung, WCF-Service und Datenbank sind alle auf verschiedenen Maschinen.

Die Daten abgerufen werden, besteht aus einem Objekt und untergeordnete Objekte ...

public Product Select(string catalogueNumber) {

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

Die Updates von der Client-Anwendung angewendet werden kann, sowie die Aktualisierung bestehender Inhalte, auch zusätzliche „Track“ Objekte einfügen.

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

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

}

Sicher hat es ein einfacherer Weg, dies zu tun?

Hinweis: Ich habe den größten Teil des Nachmittags Untersuchung des EntityBag Projekt ausgegeben, fand aber, dass dies nicht aktualisiert wurde mit EF RTM zu arbeiten. Insbesondere während es erfolgreich aktualisiert werden die vorhandenen Daten Ausnahmen ausgelöst, wenn in neuen Objekten zu mischen.

War es hilfreich?

Lösung

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

Sie sind auf der Oberseite des Entity Framework, WCF RESTful Interface gebaut, und sie bieten eine clientseitige Erfahrung, und sie scheinen auch nicht nur für die Abfrage eine anständige Geschichte zu haben, aber auch die Aktualisierung, Einfügen von Datensätzen in Datenbanken.

Könnte dies eine Option sein?

Überprüfen Sie sie heraus auf MSDN , auf David Hayden Blog , auf Channel9 oder einige der ausgezeichneten sehen Sitzungen unter MIX08 und MIX 09

Marc

Andere Tipps

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

Es ist so konzipiert, diese Art von Problemen 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 planen, tun ein T4-Vorlage für Ihnen zu helfen, ist die Schaffung, die Klassen für Sie generiert, die der Selbst Tracking-fähig sind, und einige zusätzliche Oberfläche, die sie für diese Selbst Tracking Entitäten ApplyChanges einfach zu machen () auf den Kontext, wenn sie an den Server zurück Tier erhalten.

Hope, das hilft

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

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

Weeeeee! Selbst Tracking-Einheiten sind angekommen in EF 4!

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 Entity Framework-Team.

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

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

Genießen Sie!

In Entity Framewrok 4 können Sie die Methode "applyCurrentValues" verwenden, um eine freistehende Einheit zu aktualisieren.

In Ihrem Szenario so etwas wie dies sein wird:

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

Eine der Einschränkungen von Entity Framework v1.0 wird aktualisiert Entities. Leider glaube ich Ihnen kein Glück bis zur Version 2 kommt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top