Archive for the ‘Entity Framework’ Category

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);
Anúncios

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.

Usando Stored Procedures no Entity Framework 4.0

abril 18, 2010

Para usarmos Stored Procedures no Entity Framework, precisamos primeiro gerar o EDMX. 

 

Depois, selecionamos a base de dados que queremos usar. 

 

O próximo passo é selecionar as Tabelas e as Stored Procedures necessárias. 

 

Finalizado esta etapa o arquivo EDMX é gerado. 

 

Se depois de gerado o EDMX tentarmos usar uma Stored Procedure não vamos conseguir. 

 

Para que isso seja possível, devemos seguir os seguintes passos:

Devemos ir até o EDMX e na janela Model Browser (menu View, Other Windows, Entity Data Model Browser).  

Como podemos notar, a pasta Function Imports  do EDMX está vazia. Já a pasta Stored Procedures da Store contém todas as Stored Procedures que selecionamos anteriormente. 

  

  

  

Existem duas formas para adicionarmos as Stored Procedures para a pasta Function Imports. A primeira delas é clicando com o botão direito em cima de Function Imports e depois em Add Function Import…

 

 

 

Uma nova janela (Add Function Import) é aberta para selecionarmos a Stored Procedure e configurá-la.

 

 

 

Feito isso, podemos usar a Stored Procedure sem problemas.

 

 

 

A segunda forma de adicionarmos uma Stored Procedure e clicarmos em cima da mesma com o botão direito do mouse e depois em Add Function Import…

 

 

Observe que nesse caso, o campo Function Import Name é automaticamente preenchido com o nome da Stored Procedure. Observe também que há um botão, Get Column Information que nos mostra quais colunas são retornadas quando a Stored Procedure é executada. Podemos observar ainda que é possível selecionar o retorno, são quatro opções:

  • None – Nenhum tipo de retorno.
  • Scalars – Retorna um tipo específico (Binary, Boolean, Int32, etc.).
  • Complex – Retorna um tipo complexo com propriedades que correspondem às colunas retornadas pela Stored Procedure (Esse tipo é automaticamente gerado quando clicamos no botão Create New Complex Type).
  • Entities – Retorna uma entidade.

No nosso caso, como a Stored Procedure retorna todos os campos, selecionamos EntitiesStudentGrade. 

 

 

 

Por fim, executamos a Stored Procedure.