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 |
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 |
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. |
As seguintes considerações se aplicam quando estiver anexando objetos a um contexto:
Referências:
José Carlos Macoratti