use - visual c# entity framework




Entidade Framework.Remove() vs..DeleteObject() (2)

Não é geralmente correto que você pode " remover um item de um banco de dados " com os dois métodos. Para ser preciso, é assim:

  • ObjectContext.DeleteObject(entity) marca a entidade como Deleted no contexto. (É EntityState é Deleted depois disso.) Se você chamar SaveChanges depois, a EF enviará uma instrução SQL DELETE para o banco de dados. Se nenhuma restrição referencial no banco de dados for violada, a entidade será excluída, caso contrário, uma exceção será lançada.

  • EntityCollection.Remove(childEntity) marca o relacionamento entre pai e childEntity como Deleted . Se o childEntity si for excluído do banco de dados e o que exatamente acontece quando você chama SaveChanges depende do tipo de relacionamento entre os dois:

    • Se o relacionamento for opcional , isto é, a chave estrangeira que se refere do filho ao pai no banco de dados permitir valores NULL , esse estrangeiro será definido como nulo e, se você chamar SaveChanges esse valor NULL para childEntity será gravado no banco de dados ( ou seja, a relação entre os dois é removida). Isso acontece com uma UPDATE SQL UPDATE . Nenhuma instrução DELETE ocorre.

    • Se o relacionamento for necessário (o FK não permite valores NULL ) e o relacionamento não estiver se identificando (o que significa que a chave estrangeira não faz parte da chave primária (composta) do filho), é necessário adicionar o filho a outro pai ou você precisa excluir explicitamente o filho (com DeleteObject seguida). Se você não fizer nada disso, uma restrição referencial será violada e a EF lançará uma exceção quando você chamar SaveChanges - a infame " A relação não pôde ser alterada porque uma ou mais propriedades da chave estrangeira não é anulável " ou similar.

    • Se o relacionamento estiver se identificando (é necessariamente obrigatório , porque qualquer parte da chave primária não pode ser NULL ), o EF também marcará o childEntity como Deleted . Se você chamar SaveChanges uma instrução SQL DELETE será enviada ao banco de dados. Se nenhuma outra restrição referencial no banco de dados for violada, a entidade será excluída, caso contrário, uma exceção será lançada.

Na verdade, estou um pouco confuso sobre a seção Remarks na página do MSDN que você vinculou porque diz: " Se o relacionamento tiver uma restrição de integridade referencial, chamar o método Remove em um objeto dependente marca o relacionamento eo objeto dependente para exclusão. ". Isso parece impreciso ou até errado para mim porque todos os três casos acima têm uma " restrição de integridade referencial ", mas somente no último caso a criança é de fato excluída. (A menos que eles signifiquem com " objeto dependente " um objeto que participa de um relacionamento de identificação que seria uma terminologia incomum embora.)

Você pode remover um item de um banco de dados usando EF usando os dois métodos a seguir.

O primeiro está no EntityCollection e o segundo no ObjectContext .

Quando cada um deve ser usado?

É um preferido sobre o outro?

Remove() retorna um bool e DeleteObject() retorna void .


Se você realmente quer usar Deleted, você teria que tornar suas chaves estrangeiras anuláveis, mas então você terminaria com registros órfãos (que é uma das principais razões pelas quais você não deveria estar fazendo isso em primeiro lugar). Então é só usar o Remove()

ObjectContext.DeleteObject (entidade) marca a entidade como Excluída no contexto. (É EntityState é excluído depois disso.) Se você chamar SaveChanges depois, a EF enviará uma instrução SQL DELETE para o banco de dados. Se nenhuma restrição referencial no banco de dados for violada, a entidade será excluída, caso contrário, uma exceção será lançada.

EntityCollection.Remove (childEntity) marca o relacionamento entre pai e childEntity como Excluído. Se o childEntity em si for excluído do banco de dados e o que exatamente acontece quando você chama SaveChanges depende do tipo de relacionamento entre os dois:

Uma coisa digna de nota é que a configuração .State = EntityState.Deleted não aciona a mudança detectada automaticamente. ( archive )





orm