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 comoDeleted
no contexto. (ÉEntityState
éDeleted
depois disso.) Se você chamarSaveChanges
depois, a EF enviará uma instrução SQLDELETE
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 echildEntity
comoDeleted
. Se ochildEntity
si for excluído do banco de dados e o que exatamente acontece quando você chamaSaveChanges
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ê chamarSaveChanges
esse valorNULL
parachildEntity
será gravado no banco de dados ( ou seja, a relação entre os dois é removida). Isso acontece com umaUPDATE
SQLUPDATE
. Nenhuma instruçãoDELETE
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 (comDeleteObject
seguida). Se você não fizer nada disso, uma restrição referencial será violada e a EF lançará uma exceção quando você chamarSaveChanges
- 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á ochildEntity
comoDeleted
. Se você chamarSaveChanges
uma instrução SQLDELETE
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 )