2009-04-29 6 views
10

J'ai créé une solution n-tier où je suis en train de récupérer des données connexes à partir d'un service WCF, sa mise à jour dans une application Windows Forms, puis renvoyer les données mises à jour via WCF pour être conservées à la base de données . L'application, le service WCF et la base de données sont tous sur des machines différentes.Entity Framework, WCF et mises à jour

Les données récupérées se compose d'un objet et des objets enfant ...

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 cliente peut, ainsi que la mise à jour du contenu existant, insérez également des objets « Track » supplémentaires.

Quand je reçois l'objet produit retour de l'application cliente, je peux voir tous les correctement mises à jour, mais afin de sauver tous les changements correctement, je dois sauter à travers quelques cerceaux ...

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?

Note: J'ai passé la plus grande partie de l'après-midi enquête sur le projet EntityBag, mais a constaté que cela n'a pas été mis à jour pour fonctionner avec EF RTM. En particulier, alors qu'il mettra à jour avec succès les exceptions de données existantes sont levées lors du mélange dans de nouveaux objets.

Répondre

3

Je n'ai pas une réponse prête pour votre scénario particulier - mais juste une question: avez-vous vérifié ADO.NET Data Services (f.k.a. « Astoria »)? Ils sont construits au-dessus d'Entity Framework, l'interface RESTful de WCF, et ils offrent une expérience côté client, et ils semblent aussi avoir une histoire décente pour non seulement interroger, mais aussi mettre à jour, insérer des enregistrements dans des bases de données.

Cela pourrait-il être une option?

Check them sur MSDN, à David Hayden's blog, sur Channel9, ou voir quelques-unes des excellentes séances à MIX08 and MIX 09

Marc

+0

Ceci est probablement quelque chose que je devrais regarder dans, mais encore je n'ai pas . Malheureusement, nous avons récemment commencé à utiliser EF & WCF où je travaille et Astoria est actuellement juste un autre élément sur la liste des nouvelles technologies à étudier. Merci. –

+0

J'ai finalement commencé à regarder ça (principalement parce que j'ai commencé à jouer avec SilverLight) et en fait, je pense que c'est la réponse que je cherchais. –

0

L'une des limitations 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.

3

Vous devriez probablement prendre un coup d'oeil à l'échantillon de EntityBag de Danny Simmons.

Il est conçu pour simplifier ce genre de questions: http://code.msdn.microsoft.com/entitybag/

Comme Catz dit les choses seront beaucoup plus facile dans .NET 4.0. L'une des choses que nous prévoyons de faire pour vous aider est de créer pour vous un modèle T4 qui génère des classes capables d'auto-suivi, et une surface supplémentaire pour simplifier la tâche de ces entités d'auto-suivi. ApplyChanges() au contexte lorsqu'ils reviennent au niveau du serveur.

Hope this helps

Vive Alex (PM sur l'équipe Entity Framework de Microsoft).

+0

Ouais et vous obtenez +2 votes pour dire au gars ce que je viens de dire! :) – mhenrixon

+0

J'ai déjà essayé EntityBag et j'ai trouvé que ça ne ferait pas ce que je voulais. Les résultats de Google indiquent que EntityBag ne fonctionne pas avec EF/RTM, mais il est tout aussi probable que je puisse le faire de manière erronée - de toute façon, j'ai eu beaucoup d'exceptions en essayant de mettre à jour mon objet parent. la collection d'objets enfants. Merci quand même! –

1

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

Weeeeee! Les entités Self-Tracking sont arrivées dans EF 4!

Check this out:

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-cadre de l'entité.

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

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

Profitez-en!

1

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

Dans votre scénario sera quelque chose comme 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 ce sera utile

Questions connexes