Pílula de Entity Framework 4 - Anexando Objetos


No Entity Framework (EF), objetos podem ser anexados (attached) a ou desanexados (detached) de um contexto. Objetos que são anexados a um contexto são tratados e gerenciados por este contexto.

Objetos desanexados não são referenciados pelo contexto, e seus recursos podem ser requisitados pelo .NET Framework.

Obs: O conceito de contexto mencionado aqui esta relacionado com o ObjectContext gerado pelo Entity Framework (EF).

É importante compreender estes conceitos para evitar dor de cabeça quando formos trabalhar com o Entity Framework (EF).

Anexando Objetos

Quando uma consulta é executada em um contexto no Entity Framework, os objetos retornados são automaticamente anexados ao contexto. Além disso:

- Você pode anexar objetos a um contexto que é obtido a partir de outra fonte que não seja uma consulta.

- Você pode anexar objetos que foram previamente desanexados, objetos que foram retornados por uma consulta sem modificação (NoTracking) , ou objetos que foram obtidos fora do contexto atual.

- Você também pode anexar objetos que foram armazenados no view state de uma aplicação ASP .NET ou que foram retornados a partir de uma chamada de um método remoto ou de um Web Service.

Para anexar objetos a um contexto podemos usar um dos seguintes métodos:

System.Data.Objects.ObjectSet.AddObject(

ou

System.Data.Objects.ObjectContext.AddObject
(System.String,System.Object)

Inclui um objeto e seus objetos relacionados ao ObjectContext e define as objetos da
entidade para o estado Added. Neste estado, os objetos da entidade não são obrigados a ter valor únicos de chave.
Valores temporários de chave são atribuídos as propriedades da
chave e são atualizados com os dados da fonte de dados depois que você salvar os objetos.
Depois que você incluir os objetos, altere o estado dos objetos da entidade de forma correta.
System.Data.Objects.ObjectSet.Attach(
ou
System.Data.Objects.ObjectContext.Attach
(System.Data.Objects.DataClasses.IEntityWithKey)
e
AttachTo
Inclui um objeto ao ObjectContext e define o estado do objeto para Unchanged. Neste estado o Entity
Framework trata os valores da entity key como final. Se mais de uma entidade de tipo particular possuir
o mesmo valor da chave, o EF irá disparar uma exceção. Para evitar isso, utilize o método AddObject para anexar
objetos desanexados e então alterar o estado de forma correta.

Os objetos são anexados ao contexto no estado Unchanged e se você precisar alterar o estado de um objeto ou relacionamento porque você sabe que o seu objeto foi modificado no estado desanexado você poderá usar um dos seguintes métodos:

ChangeObjectState Altera uma entidade ou relacionamento para um novo estado (tal como Added ou Modified). Esta alteração pode ter um impacto nos relacionamentos que no qual uma entidade participa. Por exemplo, alterando o estado de uma entidade para o estado Added fará com que qualquer relacionamento não modificado também seja alterado para o mesmo estado. Da mesma forma, marcando uma entidade como Modified também marcará todas os valores como Modified.

Você pode também usar o método ChangeState do ObjectStateEntry para alterar o estado de uma entidade.

ChangeRelationshipState
Altera o relacionamento existente entre duas entidades para um estado específico. Se não houver relacionamento entre as entidades , este método irá criar um relacionamento novo no estado especificado. (Este método não é suportado para relacionamentos baseados em uma associação de chave estrangeira.)

Você pode também usar o método ChangeObjectState do ObjectStateEntry para alterar o estado de uma entidade.

ChangeState Este método se comporta da mesma forma que ChangeObjectState ou ChangeRelationshipState dependendo se o ObjectStateEntry for um objeto ou uma relacionamento
SetModifiedProperty Define as propriedades individuais para o estado Modified. Use este método quando você saber qual propriedades foram modificadas ao invès de definir toda a entidade como modificada.

Se o objeto sendo anexado tiver os valores das propriedades atualizados você pode usar um dos seguintes métodos:

System.Data.Objects.ObjectSet.ApplyCurrentValues(

or

System.Data.Objects.ObjectContext.ApplyCurrentValues.String

Copia os valores escalares a partir de um objeto fornecido para o objeto no ObjectContext que tem a mesma chave. Quaisquer valores que diferem dos valores originais serão marcados como modificados.

Se você tiver um gráfico com os valores atuais e desjar aplicar os valores originais chame o método ApplyOriginalValues

Você pode também usar o método ApplyCurrentValues do ObjectStateEntry para alterar o estado de uma entidade.

System.Data.Objects.ObjectSet.ApplyOriginalValues(

or

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

Copia os valores escalares do objeto fornecido para o conjunto de valores originais para o objeto no ObjectContext que possuir a mesma chave.Quaisquer valores que diferem dos valores originais serão marcados como modificados.

Você pode também usar o método ApplyOriginalValues do ObjectStateEntry para alterar o estado de uma entidade.

SetModifiedProperty Define as propriedades individuais para o estado Modified. Use esta propriedade quando você saber qual propriedade foi modificada ao invés de modificar a entidade toda.
GetUpdatableOriginalValues Obém uma instância de OriginalValueRecord que representa a versão atualizada dos valores originais do objeto que esta associado com o ObjectStateEntry. Use a instância OriginalValueRecord retornada para ler ou atualizar as propriedades originais do objeto individualmente.
CurrentValues Obtém a instância CurrentValueRecord que representa os valores atuais do objeto que esta associado com o seu ObjectStateEntry. Use a instância CurrentValueRecord retornada para ler ou atualizar as propriedades atuais do objeto individualmente.

Considerações para Anexar Objetos

As seguintes considerações se aplicam quando estiver anexando objetos a um contexto:

Referências:

José Carlos Macoratti