none
Entity Framework + WCF + Update RRS feed

  • Pergunta

  • Fala ai galera,

    To com o seguinte problema. Eu tenho um aplicação cliente e outra servidora. O cliente requisita uma entidade para o servidor usando WCF entao o servidor busca essa entidade no banco de dados e devolve para o cliente. No servidor, logo apos a busca, eu verifico o EntityState do objeto e ela esta EntitySate=Unchanged. Entao envio a entidade para o cliente ele ela recebe a entidade com EntityState=Detached. O  cliente faz as modificações e manda de volta para o servidor mais uma vez usando WCF.  O servidor recebe a entidade que está com EntityState = Detached. Dai surgem os problemas.

    1) Se eu tento dar um Attach(entity) para persistir as mudanças no banco da um erro dizendo que já existe uma entidade com aquela key no contexto.

    2) Se eu tento pegar o objeto original e aplicar as mundaças usando o objeto detached nao da erro mas também não salva nenhum mudança.

         EntityKey key = ((IEntityWithKey)current).EntityKey;
                object original = null;

                if (key != null)
                {
                    original = GetObjectByKey(key);
                    ApplyPropertyChanges(entitySetName, current);
                }
                int changes = SaveChanges();

    3) Se eu tento forçar o objeto configurando todas suas propriedades como modificadas ele ainda continua nao salvando:

       public void SetAllModified(IEntityWithKey entity)
            {
                var stateEntry = ObjectStateManager.GetObjectStateEntry(entity.EntityKey);
                var propertyNameList = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(pn => pn.FieldType.Name);
                foreach (var propName in propertyNameList)
                    stateEntry.SetModifiedProperty(propName);
            }

     

    Alguem sabe como eu faço para atualizar os dados dessa entidade?
    sexta-feira, 30 de outubro de 2009 14:32

Respostas

  • Tipo, você leu o que eu coloquei no item 1) ? Acontece que quando dou um Attach ele diz que já existe a entidade no contexto. O problema é que existem diversas entidades associadas a entidade que quero persistir e essas entidades tem outras entidades relacionadas. Dai eu preciso fazer um monte de codigo para persistir um objeto e isso é terrivel. Sem falar que o framework não integra bem com WCF entao ficou inviavel usa-lo.

    Enfim ... eu troquei de ORM. O EF é um lixo :) . Acontece que os proprios desenvolvedores dizem por ai que eles estao cientes das falhas e muita coisa vai vim corrigida para a versao 4.0 (que no caso do EF na verdade será a versao 2) e eu nao vou pagar para ver.

    Depois se quiser tem uma parte da discursao no link abaixo.

    http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/30eae05e-2e0f-4ad2-b577-34e22a4d5081

    • Marcado como Resposta Eliezer Reis terça-feira, 3 de novembro de 2009 21:27
    terça-feira, 3 de novembro de 2009 21:14

Todas as Respostas

  • Olá Eliezer,

    Como o objeto que você quer atualizar está detached do object context, o EntityKey está vazio. Você pode utilizar uma das seguintes alternativas:
         1- Recuperar o objeto novamente no banco de dados (porém, isto consome recursos uma vez que será necessário uma conexão e consulta a mais com o banco)
         2 - Utilize o seguinte snippet:

       void Atualizar(Entidade entidade)
    {

       using(EntidadesContext context = new EntidadesContext())
       {
         entidade.EntityKey = context.CreateEntityKey("Nome do container da entidade no EDMX ", entidade);
         context.Attach(entidade);
         entidade.SetAllModified(context);

         try
         {
           context.SaveChanges();    
         }

         catch(tratamento de excessões...)
     {
     }
       }
    }

    Segue abaixo a versão do SetAllModified que utilizei.

    public static class UpdateExtensions
        {
            public static void SetAllModified<T>(this T entity, ObjectContext context) where T : IEntityWithKey
            {
                var stateEntry = context.ObjectStateManager.GetObjectStateEntry(entity.EntityKey);
                var propertyNameList = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(
                    pn => pn.FieldType.Name);
                foreach (var propName in propertyNameList)
                {
                    stateEntry.SetModifiedProperty(propName);
                }
            }
        }


    Abraços,
    Tiago Moreira Totti

    Microsoft Innovation Center PUCRS

    Lider Técnico | MCP | MCTS | MCPD

    E-mail: tiago.totti@pucrs.br

    Fone / Fax: (51) 3320-3672

    TECNOPUC - Prédio 96B - PUCRS 

     

    • Sugerido como Resposta Tiago Totti terça-feira, 3 de novembro de 2009 19:39
    • Não Sugerido como Resposta Eliezer Reis terça-feira, 3 de novembro de 2009 21:27
    • Sugerido como Resposta Leonardo Lourenço Silva quarta-feira, 6 de fevereiro de 2013 05:01
    terça-feira, 3 de novembro de 2009 19:25
  • Tipo, você leu o que eu coloquei no item 1) ? Acontece que quando dou um Attach ele diz que já existe a entidade no contexto. O problema é que existem diversas entidades associadas a entidade que quero persistir e essas entidades tem outras entidades relacionadas. Dai eu preciso fazer um monte de codigo para persistir um objeto e isso é terrivel. Sem falar que o framework não integra bem com WCF entao ficou inviavel usa-lo.

    Enfim ... eu troquei de ORM. O EF é um lixo :) . Acontece que os proprios desenvolvedores dizem por ai que eles estao cientes das falhas e muita coisa vai vim corrigida para a versao 4.0 (que no caso do EF na verdade será a versao 2) e eu nao vou pagar para ver.

    Depois se quiser tem uma parte da discursao no link abaixo.

    http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/30eae05e-2e0f-4ad2-b577-34e22a4d5081

    • Marcado como Resposta Eliezer Reis terça-feira, 3 de novembro de 2009 21:27
    terça-feira, 3 de novembro de 2009 21:14