Pregunta

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 formularios Windows Forms, y luego devolviendo los datos actualizados a través de WCF para que permanezcan en la base de datos. La aplicación, el servicio WCF y la base de datos están en máquinas diferentes.

Los datos que se recuperan consisten en un objeto y 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 está aplicando la aplicación cliente pueden, además de actualizar el contenido existente, también insertar "Seguimiento" adicional objetos.

Cuando recibo el objeto Producto de la aplicación cliente, puedo ver todas las actualizaciones correctamente, sin embargo, para guardar todos los cambios correctamente, tengo que saltar algunos 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();

}

Seguramente, ¿tiene que haber una manera más fácil de hacer esto?

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

¿Fue útil?

Solución

No tengo una respuesta preparada para su escenario particular, pero solo una pregunta: ¿ha revisado 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?

Véalos en MSDN , en blog de David Hayden , en Channel9 , o vea algunos de los excelentes sesiones en MIX08 y MIX 09

Marc

Otros consejos

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

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

Como dice CatZ, las cosas serán mucho más fáciles en .NET 4.0.

Una de las cosas que estamos planeando hacer para ayudar es crear una plantilla T4 para usted que genere clases para usted que sean capaces de auto-seguimiento, y alguna superficie extra para que sea simple para estas entidades de auto-seguimiento ApplyChanges () al contexto cuando vuelven al nivel del servidor.

Espero que esto ayude

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

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

Weeeeee! ¡Las entidades de seguimiento automático han 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 seguimiento automático por parte del equipo del marco de la entidad.

http: // aleembawany. com / 2009/05/17 / new-features-in-entity-framework-40-v2 /
Anuncio de nuevas funciones en EF 4.

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

¡Disfruta!

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 sea útil

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top