Estou recebendo este erro "O objeto não pode ser excluído porque não foi encontrado no ObjectStateManager."
Meu código é:
protected MyEntities sqlEntities;
public virtual void Delete(TEntity entity)
{
System.Type t = typeof(TEntity);
sqlEntities.DeleteObject(entity);
sqlEntities.SaveChanges();
}
c#
asp.net
entity-framework-4
Sami
fonte
fonte
var entity = new TEntity() { PK_ID = 23 }; sqlEntities.DeleteObject(entity);
Eu estava tentando criar uma entidade simulada com seu PK definido corretamente, na esperança de que o Entity Framework chamasse DeleteObject com base no PKRespostas:
Isso significa que a entidade não está anexada (não foi carregada pela mesma instância de contexto). Experimente isto:
fonte
Apenas um pequeno esclarecimento sobre a resposta de Ladislav Mrnka (que deve ser a resposta aceita).
Se gosta de mim, você tem o código em um formato como este:
.. então é isso que você quer fazer:
Talvez isso pareça óbvio, mas não estava claro para mim inicialmente que era necessário especificar a entidade a que se atentar, e não apenas o contexto .
fonte
Apenas para propergar a explicação de Kjartans:
Eu tinha:
O problema é que usei meu próprio método (GetProject ()) para obter a entidade (portanto, usando outro contexto para carregar a entidade):
Uma solução poderia ser anexar a entidade carregada conforme Kjartan declara, outra poderia ser a solução da mina, para carregar a entidade dentro do mesmo contexto:
fonte
Eu sei que esta questão é bastante antiga, mas nenhuma das opções acima funcionou para mim, já que eu estava excluindo registros de mais de uma classe / serviço e cada um deles estava instanciando seu próprio contexto de conexão de banco de dados.
O que fiz para resolver foi enviar o primeiro contexto criado para o resto das classes / serviços que iam aceder à base de dados.
Por exemplo, eu
serviceA
iria deletar alguns de seus registros e chamarserviceB
eserviceC
fazer o mesmo com seus registros.Eu então excluiria meus registros em
serviceA
e passaria como parâmetro o contexto criado emserviceA
paraserviceB
eserviceC
.fonte
Você pode escrever este código:
fonte
Caso nenhuma das opções acima funcione, você pode tentar esta solução:
context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();
fonte
Você deve ter certeza de que seu objeto existe na lista da qual você está tentando remover, você deve colocar a seguinte condição
se você tiver uma condição complicada de igualdade, você deve substituir o método igual na classe de entidade para colocar sua condição de igualdade, para obter o caminho certo para um método de extensão "entity.contains"
fonte
Certifique-se de que o modelo que passa para Remover (Entidade) é exatamente o mesmo que o registro do banco de dados.
Algumas vezes é possível passar o modelo sem alguns campos como Id ou Data. mantenha-os em @ html.Hiddenfor se você postar como formulário.
A melhor maneira é passar o ID e obter a entidade usando o método Find (Id) e passá-lo para Remove (Entity)
Espero que isso ajude alguém.
fonte
Eu tenho esse problema e resolvo. Basta copiar o código abaixo:
fonte
No meu caso, havia um contexto, mas recebi a entidade com a opção 'AsNoTracking'
fonte