Archive for July 2014

EntityFramework-Lendo seu banco de dados com o Visual Studio 2013 Update 2

Olá pessoal,

Há algum tempo atrás eu fiz um post falando sobre como aproveitar seu banco de dados existente com o EntityFramework PowerTools, mas o modelo do PowerTools não permite escolher as tabelas ou views que você quer ler, e ás vezes isto é bem útil.

Com o lançamento do Update 2 do Visual Studio 2013 e também do EntityFramework 6.1, foi adicionada uma nova opção nas fontes de dados, que agora permite também fazer engenharia reversa com CodeFirst escolhendo quais tabelas e views serão lidas, a exemplo do que já era possível com o EntityFramework Designer.

Para demonstrar isto, vamos criar um novo projeto do tipo Console no Visual Studio 2013:

SNAGHTMLa64a79f

Agora vamos fazer a engenharia reversa, mas utilizando o novo recurso do Visual Studio 2013. Para isto, no seu projeto clique com o botão direito do mouse na solution e depois vá em Add/New Item:

image

Agora vamos adicionar um ADO.NET Entity Data Mode:

SNAGHTMLa676ebe

E veja que agora existe uma nova opção chamada “Code First from database” e com ela iremos ler um banco de dados já existente e criar todo o código para o CodeFirst.

SNAGHTMLa69ebd4

Vamos então escolher esta opção e colocar a conexão para o nosso banco de dados existente: (no meu exemplo estou usando o banco da Microsoft chamado Northwind)

SNAGHTMLa69538c

Agora você pode escolher as tabelas e views que quiser para o seu projeto do CodeFirst:

SNAGHTMLa6b3694

Feito isto, todas as classe serão geradas no CodeFirst, mas com uma grande diferença em relação ao PowerTools: as informações de mapeamento são geradas como DataAnnotations ao invés de FluentApi. Veja o exemplo da classe Products:

   1: public partial class Products

   2:     {

   3:         [Key]

   4:         public int ProductID { get; set; }

   5:

   6:         [Required]

   7:         [StringLength(40)]

   8:         public string ProductName { get; set; }

   9:

  10:         public int? SupplierID { get; set; }

  11:

  12:         public int? CategoryID { get; set; }

  13:

  14:         [StringLength(20)]

  15:         public string QuantityPerUnit { get; set; }

  16:

  17:         [Column(TypeName = "money")]

  18:         public decimal? UnitPrice { get; set; }

  19:

  20:         public short? UnitsInStock { get; set; }

  21:

  22:         public short? UnitsOnOrder { get; set; }

  23:

  24:         public short? ReorderLevel { get; set; }

  25:

  26:         public bool Discontinued { get; set; }

  27:

  28:         public virtual Categories Categories { get; set; }

  29:     }

Veja que a classe foi gerada e o DataAnnotations foi criado.

Agora é só utilizar o EntityFramework CodeFirst!

Abraços e até a próxima,

Carlos dos Santos.

Criando Índices no Entity Framework CodeFirst

Olá pessoal,

A partir da versão 6.1 do EntityFramework é possível criar índices no banco de dados, especificando isto diretamente nas classes no código fonte. Esta criação dos índices é feira através do atributo Index diretamente sobre o campo da classe. Mas atenção: isto só é possível utilizando o recurso Migrations do EntityFramework.

Para demonstrar este recurso, vamos criar um projeto do tipo Console no Visual Studio e vamos adicionar o EntityFramework CodeFirst usando o pacote NuGet.

Criando o Projeto Console:

 SNAGHTML4fb2cd3

Adicionando o EntityFramework CodeFirst com o NuGet Package (Tools/Nuget Package Manager/Package Manager Console) e iremos adicionar o pacote com o comando abaixo:

PM> Install-Package EntityFramework

Vamos agora adicionar a nossa classe de Contexto:

   1: public class Contexto : DbContext

   2: {

   3:     public DbSet<Cliente> Cliente { get; set; }

   4: }


E na sequência a classe Cliente:

   1: public class Cliente

   2:     {

   3:         public int ID { get; set; }

   4:         public string Nome { get; set; }

   5:         public string Cidade { get; set; }

   6:         public string UF { get; set; }

   7:     }

 

Criando os índices:

Vamos imaginar que você precise criar um índice para o campo Nome classe Cliente. Iremos usar então o atributo Index e também o MaxLength para determinarmos o tamanho máximo do campo. O atributo Index está no NameSpace: System.ComponentModel.DataAnnotations.Schema

   1: public class Cliente

   2:     {

   3:         public int ID { get; set; }

   4:         [Index]

   4:         [MaxLength(100)]

   5:         public string Nome { get; set; }

   6:         public string Cidade { get; set; }

   7:         public string UF { get; set; }

   8:     }

 

Veja que é bem simples, basta adicionar o atributo Index em cima do campo que você quer o índice! Você pode também dar um nome para o índice e, caso seja um índice composto (mais de um campo) indicar qual a posição do campo no índice.

Para nomear o índice, basta informar, por exemplo: [Index(“MeuIndice”)] e se você quiser informar também a posição, basta adicionar logo após o nome. Você ainda pode indicar se o índice é Clustered ou Unique. O nome do índice não é obrigatório.

Lembrando o que falei no início do post, a criação do índice é feita usando o Migrations e agora vamos adicioná-lo ao nosso projeto utilizando a Package Manager Console novamente:

PM> Enable-Migrations

Agora já podemos começar a enviar os comandos do migrations para criar ou atualizar nosso banco de dados. Começamos então adicionando um checkpoint para o migrations:

PM> Add-Migration CriacaoBanco

Se você verificar o código gerado pelo Migrations, verá a criação do índice (neste exemplo eu dei o nome “MeuIndice” para o índice):

   1: public partial class CriacaoBanco : DbMigration

   2:     {

   3:         public override void Up()

   4:         {

   5:             CreateTable(

   6:                 "dbo.Clientes",

   7:                 c => new

   8:                     {

   9:                         ID = c.Int(nullable: false, identity: true),

  10:                         Nome = c.String(maxLength: 100),

  11:                         Cidade = c.String(),

  12:                         UF = c.String(),

  13:                     })

  14:                 .PrimaryKey(t => t.ID)

  15:                 .Index(t => t.Nome, name: "MeuIndice");

  16:             

  17:         }

  18:         

  19:         public override void Down()

  20:         {

  21:             DropIndex("dbo.Clientes", "MeuIndice");

  22:             DropTable("dbo.Clientes");

  23:         }

  24:     }

 

Veja o comando .Index(t => t.nome, name: “Meu_Indice”). Ele é quem irá criar o índice quando aplicarmos a alteração no banco de dados, mas antes de criarmos o banco de dados não podemos esquecer da string de conexão de deve estar no app.config ou web.config (no caso de aplicações web). Vamos adicionar a linha com a conexão:

   1:  

   2:   <connectionStrings>

   3:     <add name="Contexto" 

   4:          connectionString="data source=(local); initial catalog=EFIndice; user id=teste; password=teste" 

   5:          providerName="System.Data.SqlClient"/>

   6:   </connectionStrings>

   7:   

   8:   

 

Agora vamos criar o banco de dados com o índice executando o comando Update-Database:

PM> Update-DataBase

Pronto, nosso banco foi criado com o índice que determinamos. Vejam a tela do Management Studio:

image

Ao invés de criar o banco diretamente, você também pode adicionar o parametro –Script ao Update-Database para assim, gerar o script do seu bando de dados.

Agora você já pode adicionar a criação de índices ao seus projetos do EntityFramework e assim, melhorar a performance de suas consultas.

Abraços e até a próxima,

Carlos dos Santos.