Entity Framework 4, objetos POCO e ASP.Net MVC2. Eu tenho um relacionamento muitos para muitos, digamos, entre entidades BlogPost e Tag. Isso significa que em minha classe POCO BlogPost gerada por T4 eu tenho:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Peço um BlogPost e as tags relacionadas de uma instância do ObjectContext e envio para outra camada (Exibir no aplicativo MVC). Mais tarde, recebo de volta o BlogPost atualizado com propriedades alteradas e relacionamentos alterados. Por exemplo, ele tinha tags "A" "B" e "C", e as novas tags são "C" e "D". Em meu exemplo particular, não há novos tags e as propriedades dos tags nunca mudam, então a única coisa que deve ser salva são os relacionamentos alterados. Agora preciso salvar isso em outro ObjectContext. (Atualização: agora tentei fazer na mesma instância de contexto e também falhei.)
O problema: não consigo salvar os relacionamentos corretamente. Eu tentei tudo que encontrei:
- Controller.UpdateModel e Controller.ExperimenteUpdateModel não funcionam.
- Obter o antigo BlogPost do contexto e depois modificar a coleção não funciona. (com métodos diferentes a partir do próximo ponto)
- Isso provavelmente iria funcionar, mas espero que esta é apenas uma solução alternativa, não a solução :(.
- Experimentei as funções Attach / Add / ChangeObjectState para BlogPost e / ou Tags em todas as combinações possíveis. Falhou.
- Este parece com o que eu preciso, mas ele não funciona (Tentei corrigi-lo, mas não pode para o meu problema).
- Tentei ChangeState / Add / Attach / ... os objetos de relacionamento do contexto. Falhou.
"Não funciona" significa, na maioria dos casos, que trabalhei na "solução" fornecida até que ela não produzisse erros e salve pelo menos as propriedades do BlogPost. O que acontece com os relacionamentos varia: geralmente as tags são adicionadas novamente à tabela de tags com novos PKs e o BlogPost salvo faz referência a esses e não aos originais. É claro que os Tags retornados têm PKs, e antes dos métodos salvar / atualizar eu verifico os PKs e eles são iguais aos do banco de dados, então provavelmente EF pensa que eles são objetos novos e aqueles PKs são temporários.
Um problema que conheço e que pode tornar impossível encontrar uma solução automatizada simples: Quando a coleção de um objeto POCO é alterada, isso deve acontecer pela propriedade de coleção virtual mencionada acima, porque então o truque FixupCollection atualizará as referências reversas na outra extremidade do relacionamento muitos para muitos. No entanto, quando uma Visualização "retorna" um objeto BlogPost atualizado, isso não aconteceu. Isso significa que talvez não haja uma solução simples para o meu problema, mas isso me deixaria muito triste e eu odiaria o triunfo EF4-POCO-MVC :(. Isso também significaria que EF não pode fazer isso no ambiente MVC, seja qual for Tipos de objeto EF4 são usados :(. Acho que o rastreamento de alterações baseado em instantâneo deve descobrir que o BlogPost alterado tem relacionamentos com Tags com PKs existentes.
Aliás: acho que o mesmo problema acontece com as relações um-para-muitos (o Google e meu colega dizem isso). Vou tentar em casa, mas mesmo que funcione, isso não me ajuda em meus seis relacionamentos muitos-para-muitos em meu aplicativo :(.