Question

J'ai créé une solution à plusieurs niveaux dans laquelle je récupère les données associées d'un service WCF, les met à jour dans une application Windows Forms, puis renvoie les données mises à jour via WCF à la base de données. L’application, le service WCF et la base de données sont tous situés sur des ordinateurs différents.

Les données en cours de récupération consistent en un objet et des objets enfants ...

public Product Select(string catalogueNumber) {

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

Les mises à jour appliquées par l’application client peuvent, de même que la mise à jour du contenu existant, également insérer des "Autres pistes" supplémentaires. objets.

Lorsque je reçois l'objet Produit en retour de l'application cliente, je peux voir toutes les mises à jour correctement. Toutefois, pour pouvoir enregistrer toutes les modifications correctement, je dois passer par quelques étapes ...

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

}

Sûrement, il doit y avoir un moyen plus facile de faire cela?

Remarque: j'ai passé la majeure partie de l'après-midi à étudier le projet EntityBag, mais j'ai constaté qu'il n'avait pas été mis à jour pour fonctionner avec EF RTM. En particulier, même si la mise à jour est réussie, les exceptions de données existantes sont levées lors du mélange de nouveaux objets.

Était-ce utile?

La solution

Je n'ai pas de réponse toute prête à votre scénario - mais juste une question: avez-vous vérifié ADO.NET Data Services (f.k.a. "quotoria")?

Ils sont construits sur Entity Framework, l'interface RESTful de WCF, et offrent une expérience côté client. Ils semblent également avoir une bonne histoire pour non seulement interroger, mais aussi mettre à jour, insérer des enregistrements dans des bases de données. / p>

Cela pourrait-il être une option?

Consultez-les sur MSDN , à Le blog de David Hayden , sur Channel9 , ou découvrez certains des excellents sessions sur MIX08 et MIX 09

Marc

Autres conseils

Vous devriez probablement jeter un coup d'œil à l'exemple EntityBag de Danny Simmons.

Il est conçu pour simplifier ces types de problèmes: http://code.msdn.microsoft.com/entitybag/

Comme CatZ le dit, les choses seront beaucoup plus faciles dans .NET 4.0.

L’une des choses que nous prévoyons de faire pour vous aider est de créer un modèle T4 pour vous, qui génère pour vous des classes capables de suivre automatiquement et une surface supplémentaire pour simplifier le transfert de ces entités à ApplyChanges. () au contexte quand ils reviennent au niveau du serveur.

J'espère que cela vous aidera

A bientôt Alex (PM dans l'équipe Entity Framework de Microsoft).

Je vois que ce fil est suivi silencieusement, alors je me permets de faire une petite mise à jour ...

Weeeeee! Les entités d'auto-suivi sont arrivées dans EF 4!

Cochez cette case:

http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
Explication du mécanisme d'auto-suivi par l'équipe de structure de l'entité.

http: // aleembawany. com / 2009/05/17 / new-features-in-entity-framework-40-v2 /
Annonce de nouvelles fonctionnalités dans EF 4.

http://msdn.microsoft.com/en-us/magazine /ee321569.aspx
Comparaison de plusieurs modèles N-Tier pour des entités déconnectées.

Profitez!

Dans Entity Framewrok 4, vous pouvez utiliser la méthode " ApplyCurrentValues ??" mettre à jour une entité détachée.

Dans votre scénario, cela ressemblera à ceci:

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

}

J'espère que cela vous sera utile

L'une des limites de Entity Framework v1.0 est la mise à jour des entités. Malheureusement, je pense que vous n'avez pas de chance jusqu'à ce que la version 2 arrive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top