Pergunta

Eu criei uma solução de n-tier onde eu estou recuperando dados relacionados de um serviço WCF, atualizando-o dentro de um aplicativo Windows Forms, e em seguida, retornando os dados atualizados via WCF ser persistentes no banco de dados. O aplicativo, Serviço WCF e banco de dados estão todos em máquinas diferentes.

Os dados que estão sendo recuperados consiste em um objeto e objetos filho ...

public Product Select(string catalogueNumber) {

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

As atualizações que está sendo aplicada pela lata aplicação do cliente, bem como atualizar conteúdo existente, também inserir objetos adicionais "Track".

Quando eu receber o objeto Product volta do aplicativo cliente, eu posso ver todas as atualizações corretamente, no entanto, a fim de salvar todas as mudanças corretamente eu tenho que saltar através de algumas 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();

}

Com certeza, tem que haver uma maneira mais fácil de fazer isso?

Nota: Eu passei a maior parte da tarde investigar o projeto EntityBag, mas descobriu que isso não foi atualizado para trabalhar com EF RTM. Em particular, enquanto ele irá atualizar com sucesso as exceções de dados existentes são jogados ao misturar em novos objetos.

Foi útil?

Solução

Eu não tenho uma resposta pronta para o seu cenário particular - mas apenas uma pergunta: você tem verificado a ADO.NET Data Services (f.k.a. "Astoria")

Eles são construídos em cima de Entity Framework, interface RESTful do WCF, e eles oferecem uma experiência do lado do cliente, mais eles também parecem ter uma história decente para não apenas consultando, mas também atualizar, inserir registros em bases de dados.

Isso poderia ser uma opção?

Vê-los em MSDN , em blog de David Hayden "noreferrer nofollow" , em Channel9 , ou ver alguns dos excelentes sessões em MIX08 e MIX 09

Marc

Outras dicas

Você provavelmente deve dar uma olhada em amostra EntityBag Danny Simmons'.

Ele é projetado para simplificar esses tipos de problemas: http://code.msdn.microsoft.com/entitybag/

Como Catz diz as coisas serão muito mais fácil no .NET 4.0.

Uma das coisas que estamos planejando fazer para ajudar é criar um modelo T4 para você que gera classes para você que são capazes de auto-tracking, e alguns superfície extra para torná-lo simples para estas entidades auto-tracking para ApplyChanges () para o contexto quando eles voltarem para a camada do servidor.

Espero que isso ajude

Felicidades Alex (PM na equipe Entity Framework da Microsoft).

Eu vejo que esta discussão é tranquila seguido, então eu me permito fazer uma pequena atualização ...

Weeeeee! Auto-Tracking entidades chegou a EF 4!

Verificar isso:

http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
Explicação do mecanismo de auto-monitoramento pela equipe de estrutura de entidade.

http: // aleembawany. COM / 2009/05/17 / novas-features-in-entity-framework-40-v2 /
Anouncement das novas funcionalidades do EF 4.

http://msdn.microsoft.com/en-us/magazine /ee321569.aspx
Comparação de vários padrões de n-tier para entidades desconectados.

Aproveite!

Em Entidade Framewrok 4 você pode usar o método de "ApplyCurrentValues" para atualizar uma entidade separada.

Em seu cenário será algo como isto:

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

Uma das limitações do Entity Framework v1.0 está atualizando Entidades. Infelizmente eu acho que você está fora de sorte até a versão 2 chega.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top