Um objeto com a mesma chave já existe no ObjectStateManager | Mastigado
← 03 – Criando um aplicação completa em Asp.Net/MVC 4 e ExtJS 4 – Modelo Lógico, Normalização de Dados(Formas Normais) e criação de banco em SQL Server e MySQL
ASP.Net Erros indesejáveis →
Um objeto com a mesma chave já existe no ObjectStateManager
setembro 19, 2013 2 Comentários
Sim pessoal, o título pode parecer meio estranho, mas isto pode um dia acontecer com você.
Você pode em algum momento estar programando em C# e de repente, quando tenta atualizar um objeto, um erro como este surge em seu Visual Studio
Pode até soar estranho, se como eu, você trabalha com níveis de permissões de usuário e precisa em algum momento, alterar a permissão de acesso de um deles, mas quando menos se espera, é surpreendido por uma mensagem dizendo que já existe um objeto com a mesma chave no ObjectStateManager.
Para quem não sabe, segundo definição da Microsoft, o ObjectStateManager, Obtém o Gerenciador de estado de objetos usado pelo contexto do objeto para controlar alterações do objeto.
Mas enfim, procurei várias alternativas para resolver este erro, porém, somente em um site encontrei uma resposta suficientemente simples para eu poder reproduzir abaixo seu post, muito bem mastigado.
O problema surge a partir do modo como o ObjectContext funciona. Em condições normais, a store do ObjectContext guarda em seu cache uma instância(e apenas uma) da classe ObjectStateEntry para cada entidade. Isso significa que não podemos ter mais de uma entidade(exemplo: registro) com a mesma chave no cache.
Mesmo que isto pareça ser óbvio, em algumas circunstâncias, este não é o comportamento que queremos. Contudo, podemos resolver o problema de diferentes maneiras. Aqui nós fornecemos um truque.
Vamos começar por reproduzir o problema(me desculpe se o exemplo a seguir é tão trivial, mas o único objetivo é reproduzir o erro):
Quando executarmos esse código, teremos o erro An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key. Isso porque nós demos um Attach(anexamos) num contexto da mesma entidade(observe a chave(key)).
Uma maneira fácil de impedir este problema é utilizarmos dois diferentes contextos. Olhe para este código:
Neste último trecho de código, nós usamos dois contextos diferentes que têm dois caches diferentes. É por isso que não temos qualquer erro.
fonte: http://library.logicsistemi.it/en/net/general-topics/81-an-object-with-the-same-key-already-exists-in-the-objectstatemanager
Filed under C# Tagged with An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key