EF41 – Inicializadores de Banco de Dados

Ao trabalharmos com o Entity Framework Code First nos deparamos com diversas convenções. Uma das mais importantes é processo de construção do banco de dados. O Entity Framework 4.1 nos fornece nativamente três inicializadores de banco de dados, sendo eles:

DropCreateDatabaseIfModelChanges:apaga e recria o banco de dados toda vez que alguma alteração no modelo de classes for identificada. Observação: se a tabela EdmMetadata não estiver sendo criada no banco de dados (através da remoção da convention IncludeMetadataConvention), então está opção não irá funcionar e irá disparar uma Exception do tipo NotSupportedException.

CreateDatabaseIfNotExists:cria o banco de dados se o mesmo não existir, se o modelo de classes sofrer alguma alteração será disparada uma exception.

DropCreateDatabaseAlways:apaga e recria o banco de dados sempre, mesmo que nenhuma alteração no modelo de classes tenha sido feita.

Existem dois modos de definir a inicialização do seu banco de dados:

1 – Dentro da sua classe de contexto com o banco de dados.

public class DatabaseContext : DbContext {  public DatabaseContext() { Database.SetInitializer( new DropCreateDatabaseAlways<DatabaseContext>()); } } 

2 – Em sua aplicação, preferencialmente em algum ponto “estratégico” que será executado sempre a frente dos demais pontos da aplicacação.

class Program { static void Main(string[] args) { Database.SetInitializer( new DropCreateDatabaseAlways<DatabaseContext>()); 

Todos estes inicializadores de banco de dados compartilham de uma interface chamada IDatabaseInitializer. Esta interface é útil, pois permite que construamos nossos próprios inicializadores de banco de dados.

A criação de inicializadores de banco de dados não é tão distante de nossas necessidades e é mais necessária do que se pode imaginar. Toda vez que criamos (ou recriamos) um banco de dados, ele é construído em branco, isto é, sem registros nas tabelas. Mas existem casos em que é preciso que algumas tabelas contenham valores padrão, isto é, um conjunto pré-definido de registros para serem utilizados no seu banco de dados. Alguns exemplos de tabelas que seguem esse perfil: tabela de estados brasileiros, tabela de status de pedido, tabela de configuração, tabela de usuários, etc. Como exemplo, vamos criar um inicializador de banco de dados que após criar o banco de dados adiciona um usuário “Admin” a tabela de usuários. Sua implementação será algo como:

public class DropCreateDatabaseWithDefaultValues : DropCreateDatabaseAlways<DatabaseContext> {  protected override void Seed(DatabaseContext context) { context.Usuarios.Add( new Usuario() { Login = "Admin", Password = "123456" }); } } 

Note que a classe DropCreateDatabaseWithDefaultValues herda de DropCreateDatabaseAlways, isso faz com que o comportamento de sempre do inicializador sempre apague e recrie o banco de dados, mesmo que o modelo de classes não tenha sido alterado. O método Seed é próprio para este tipo de abordagem.

Outra opção é evitar que a criação ou exclusão do banco de dados ocorra. Este cenário é válido quando o banco de dados já existe e o EF41 não deve alterar sua estrutura. Para tanto, é necessário que seja feita a seguinte configuração:

Database.SetInitializer(null); 

A passagem de NULL para o inicializador do banco de dados indica que o EF41 não deve executar nenhuma alteração sobre o modelo de banco de dados.

Esses são os métodos mais utilizados para inicialização/criação dos bancos de dados através do Entity Framework 4.1. Espero que essas informações sejam úteis quando estiverem construindo seus modelos com o EF41.

Por
Fernando Henrique Inocêncio Borba Ferreira

Publicidade

2 comentários sobre “EF41 – Inicializadores de Banco de Dados

  1. Caso seja necessário apenas atualizar o modelo de dados, mas sem recriar o banco, para não perder dados, como eu faço?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.