2009-04-29 25 views
10

He creado una solución de n niveles donde estoy recuperando datos relacionados de un servicio WCF, actualizándolos dentro de una aplicación de Windows Forms, y luego devolviendo los datos actualizados a WCF para persistir en la base de datos . La aplicación, el servicio WCF y la base de datos están en diferentes máquinas.Entity Framework, WCF y actualizaciones

que los datos sean recuperados consiste en un objeto y los objetos secundarios ...

public Product Select(string catalogueNumber) { 

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

Las actualizaciones que se aplica por la aplicación cliente puede, además de actualizar el contenido existente, también insertar objetos adicionales "Track".

Cuando recibo el objeto Producto de vuelta de la aplicación cliente, puedo ver todas las actualizaciones correctamente, sin embargo con el fin de guardar todos los cambios correctamente tengo que saltar a través de unos aros ...

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

} 

Sin duda, tiene que haber una manera más fácil de hacer esto?

Nota: pasé la mayor parte de la tarde investigando el proyecto EntityBag, pero descubrí que esto no se ha actualizado para funcionar con EF RTM. En particular, aunque actualizará con éxito las excepciones de datos existentes, se lanzarán al mezclar en objetos nuevos.

Respuesta

3

No tengo una respuesta preparada para su situación particular, pero solo una pregunta: ¿ha comprobado ADO.NET Data Services (f.k.a. "Astoria")?

Están construidos sobre Entity Framework, la interfaz RESTful de WCF, y ofrecen una experiencia del lado del cliente, además de que también parecen tener una historia decente no solo para consultar, sino también para actualizar, insertar registros en bases de datos.

¿Podría ser esta una opción?

hacerles en MSDN, en David Hayden's blog, en Channel9, o ver algunas de las excelentes sesiones en MIX08 and MIX 09

Marc

+0

Esto es probablemente algo que debería mirar en, pero hasta ahora no lo he hecho . Desafortunadamente, solo recientemente hemos comenzado a usar EF & WCF donde trabajo y Astoria es actualmente solo otro elemento en la lista de nuevas tecnologías para investigar. Gracias. –

+0

Finalmente me he dado cuenta de esto (principalmente porque comencé a jugar con SilverLight) y en realidad, creo que es la respuesta que estaba buscando. –

0

Una de las limitaciones de Entity Framework v1.0 es la actualización de entidades. Desafortunadamente, creo que no tienes suerte hasta que llegue la versión 2.

3

Probablemente debería echar un vistazo a la muestra EntityBag Danny Simmons.

Está diseñado para simplificar este tipo de cuestiones: http://code.msdn.microsoft.com/entitybag/

como dice CatZ las cosas serán mucho más fácil en .NET 4.0.

Una de las cosas que estamos planeando para ayudar es crear una plantilla T4 para usted que genere clases para usted que sean capaces de auto-rastrear, y una superficie adicional para que estas entidades de auto-seguimiento puedan ApplyChanges() al contexto cuando regresan al nivel del servidor.

Esperanza esto ayuda

Saludos Alex (PM en el equipo de Entity Framework en Microsoft).

+0

¡Sí, y obtienes +2 votos por decirle al tipo lo que acabo de decir! :) – mhenrixon

+0

Ya he probado EntityBag y descubrí que no haría lo que quería. Los resultados de Google indican que EntityBag no funciona con EF/RTM, pero es probable que yo lo esté haciendo mal; de cualquier manera, recibí muchas excepciones cuando intentaba actualizar mi objeto principal cuando también contenía actualizaciones y adiciones a la colección de objetos secundarios. ¡Gracias de todos modos! –

1

Veo que este hilo es seguido silenciosamente, así que me permito hacer una pequeña actualización ...

Weeeeee! Entidades de auto-seguimiento ha llegado a EF 4!

mira esto:

http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
Explicación del mecanismo de auto-seguimiento por el equipo marco de la entidad.

http://aleembawany.com/2009/05/17/new-features-in-entity-framework-40-v2/
Anouncement de nuevas características en EF 4.

http://msdn.microsoft.com/en-us/magazine/ee321569.aspx
Comparación de varios patrones de N niveles para entidades desconectadas.

¡Disfrútalo!

1

En Entity Framewrok 4 puede usar el método "ApplyCurrentValues" para actualizar una entidad separada.

En su escenario será algo como esto:

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

}

espero que será útil