Um objeto com a mesma chave já existe no ObjectStateManager


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

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

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.

fonte: https://mastigado.wordpress.com

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):


TestMVCEntities db = new TestMVCEntities();

News testNews = new News();

testNews.NewsID = 1;

db.News.Attach(testNews);

News testNews2 = new News();

testNews2.NewsID = 1;

db.News.Attach(testNews2);

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:


TestMVCEntities db = new TestMVCEntities();

TestMVCEntities db2 = new TestMVCEntities();

News testNews = new News();

testNews.NewsID = 1;

db.News.Attach(testNews);

News testNews2 = new News();

testNews2.NewsID = 1;

db2.News.Attach(testNews2);

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

fonte: https://mastigado.wordpress.com

Sobre Mastigado
Sou um daqueles que precisa mudar o mundo.

2 Responses to Um objeto com a mesma chave já existe no ObjectStateManager

  1. Cleber disse:

    Valeu cara, seu artigo me ajudou a elucidar um problema.

    Curtir

    • Mastigado disse:

      Valeu!

      Curtir

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: