Archive for agosto \15\UTC 2010

Usando Lazy Loading e Eager Loading no Entity Framework 4.0

agosto 15, 2010

  

Lazy Loading e Eager Loading são formas de carregamento de dados. 

Lazy Loading 

Com o Lazy Loading habilitado as entidades relacionadas são carregadas quando as mesmas são acessadas pela Navigation Property

Vejamos a estrutura abaixo: 

  

Temos três entidades, Cliente, Telefone e Extrato. Se o Lazy Loading estiver habilitado, quando carregarmos a entidade Cliente todas as entidades relacionadas (Telefone e Extrato) não serão carregadas. 

Se usarmos o Entity Framework para gerar a camada de objetos, o Lazy Loading vem habilitado por default

Para habilitar ou desabilitar o Lazy Loading basta configurarmos a propriedade ContextOptions.LazyLoadingEnable do contexto. 

Para ficar mais claro, vamos carregar a entidade Cliente com o Lazy Loading habilitado e desabilitado. 

using (DbTesteContainer context = new DbTesteContainer())
{
    context.ContextOptions.LazyLoadingEnabled = true;

    var clientes = context.Cliente;

    foreach (var cliente in clientes)
    {
        Console.WriteLine("Cliente: {0}", cliente.Nome);

        foreach (var telefone in cliente.Telefone)
        {
            Console.WriteLine("Telefone: {0} - {1}",
                telefone.DDD, telefone.Numero);
        }
    }
}

Com o Lazy Loading habilitado conseguimos percorrer por todas as entidades relacionadas sem problemas. 

 

Desabilitando o Lazy Loading, quando acessarmos a entidade Telefone através da Navigation Property não teremos sucesso, pois a propriedade Telefone está nula. 

  

Abaixo outro exemplo. 

using (DbTesteContainer context = new DbTesteContainer())
{
    context.ContextOptions.LazyLoadingEnabled =
        false;

    var cliente = context.Cliente.FirstOrDefault();

    try
    {
        Console.WriteLine(
            cliente.Telefone.FirstOrDefault().Numero);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Qual o resultado?

Uma exceção do tipo NullReferenceException é disparada.

 

 

Eager Loading

Eager Loading é o oposto do Lazy Loading, ou seja, quando carregamos uma entidade podemos carregar todas (ou algumas) entidades relacionadas ao mesmo tempo através da Navigation Property. Existem duas formas de se fazer isso, a forma implícita e a forma explícita. 

Forma Implícita 

Na forma implícita usamos o método Include

using (DbTesteContainer context = new DbTesteContainer())
{
    context.ContextOptions.LazyLoadingEnabled =
        false;

    var cliente =
        context.Cliente.Include("Telefone").FirstOrDefault();

    try
    {
        Console.WriteLine(
            cliente.Telefone.FirstOrDefault().Numero);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.GetBaseException());
    }
}

  

Forma Explícita 

Na forma explícita usamos o método LoadProperty do contexto. 

using (DbTesteContainer context = new DbTesteContainer())
{
    context.ContextOptions.LazyLoadingEnabled =
        false;

    Cliente cliente = context.Cliente.FirstOrDefault();
    context.LoadProperty(cliente, "Telefone");

    try
    {
        Console.WriteLine(
            cliente.Telefone.FirstOrDefault().Numero);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.GetBaseException());
    }
}

  

O problema dos métodos Include e LoadProperty é o fato de não serem fortemente tipados. Mas uma solução é usarmos o método LoadProperty<TEntity>(TEntity entity, Expression<Func<TEntity, object>> selector)

Cliente cliente = context.Cliente.FirstOrDefault();
context.LoadProperty<Cliente>(cliente, c => c.Telefone);

Usando Model-First no Entity Framework 4.0

agosto 14, 2010

Um recurso muito interessante no Entity Framework Designer do Visual Studio 2010 é a capacidade de gerarmos o DDL (Data Definition Language) a partir de nossas entidades (classes).

Para começar adicionamos a template ADO.NET Entity Data Model ao projeto.

Adicionar ADO.NET Entity Data Model

Na janela Entity Data Model Wizard selecionamos Empty model.

Empty Model

Depois de feito isso, começamos a criação de nossas entidades.  Para adicionar uma nova entidade, podemos clicar com o botão direito do mouse na superfície do designer e selecionar Add –> Entity…

Adicionar Entidade

Ou pela Toolbox.

Adicionar Entidade

Adicionando pelo Designer, uma nova janela (Add Entity) é aberta  para que possamos configurá-la.

Adicionar Entidade

Para adicionar uma nova propriedade, basta clicarmos com o botão direito do mouse em cima da entidade e selecionar Add –> Scalar Property.

Scalar Property

Depois de nossa propriedade devidamente renomeada configuramos suas propriedades, para isso podemos clicar com o botão direito do mouse em cima da propriedade e selecionar Properties ou então pressionando a tecla F4.

Para criarmos os relacionamentos também temos duas opções, pela ToolBox e pelo Designer.

Adicionar Relacionamento

Feito isso, configuramos o relacionamento.

Configurar Relacionamento

A opção Navigation Property nos permite navegar nas entidades relacionadas. Podemos habilitar ou não e também podemos nomear da forma que nos convém.

Já a opção Add foreign key properties to the ‘Nome da Entidade’ Entity, como o próprio nome já diz adiciona uma chave estrangeira, nesse caso é adicionado a propriedade ClienteClienteId na entidade Telefone. Se optarmos por não adicionar a chave estrangeira temos que fazer isso manualmente, para isso configuramos Referential Constraint nas propriedades do relacionamento.

 

Depois de todas as entidades criadas vamos gerar o script, para isso clicamos com o botão direito do mouse na superfície do designer e selecionamos Generate Database from Model…

Gerar Database

A janela Generate Database Wizard é mostrada e nela selecionamos o banco de dados a ser usado.

Wizard Gerar Database

Clicando em Next, é gerado o script para que possamos executá-lo no SQL Server.

Script

E por último executamos o script no Banco de Dados, podemos copiar e colar o script no SQL Server, abrir o arquivo .sql gerado ou então pela própria IDE do Visual Studio 2010.

Executar Script

Pronto, agora podemos usar nosso banco de dados.