Entity Framework 4:Proxies – parte I
Olá pessoal,no ultimo post da série sobre o Entity Framework 4 nós falamos sobre LazyLoading. Hoje o assunto será os diferentes tipos de proxies.
O EF 4 possui dois tipos de proxies, são eles:
- LazyLoading proxy
- Change Tracking proxy
A classe que serve para o mapeamento deve possuir as seguintes configurações:
- Deve ser publica e não possuir a keywork sealed
- Deve possuir um construtor sem parâmetros publico ou privado
- Deve possuir propriedades publicas ou protegidas
LazyLoadingProxy
Este tipo de proxy é utilizado quando queremos usar lazyLoading em determinadas propriedades.Para este tipo de proxy funcionar basicamente precisamos habilitar o lazy Loading no Data Context e declarar a propriedade como virtual, e caso seja uma coleção a preferência é Icollection.
ctx.ContextOptions.LazyLoadingEnabled = true;
public virtual ICollection<Contact> Contacts { get; set; }
Change Tracking Proxy
Este tipo de proxy é o mais legal, pois a função dele é controlar as alterações nos objetos mapeados pelo EF.
Snapshot
O padrão de controle de alteração é conhecido como snapshot, este processo é assim chamado pois a cada query realizada uma cópia dos valores do objeto é realizada.Quando chamamos um método para salvar as alterações uma comparação entre o estado atual e os snapshots é realizada. Este mecanismo pode levar ao armazenamento de muitos snapshots fazendo com que a memoria fique cheia.
Proxies
Quando o change tracking proxy é usado o objeto notifica diretamente o ObjectStateManager. Os proxies funcionam interceptando as alterações no objeto, para isso alguns passos devem ser seguidos:
- Todas as propriedades mapeadas devem ser declaradas virtuais e com escopo público ou protegido
- Coleções devem ser do tipo Icollection e devem possuir get e set
quando utilizamos este tipo e proxy um objeto é criado em tempo de execução, este objeto criado possui a mesma interface do objeto mapeado e outros membros para habilitar o change Tracking.
Usar este tipo de proxy possui algumas peculiaridades como a instanciação de um novo objeto ou até comparação de tipos visto que o objeto gerado possui apenas a mesa interface do objeto mapeado.
O proximo post será um exemplo de uso do Change Tracking proxy, quem quiser saber mais pode olhar aqui.