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
Caso seja necessário apenas atualizar o modelo de dados, mas sem recriar o banco, para não perder dados, como eu faço?
Olá Jefferson,
No caso vc terá de utilizer o Entity Framework Code Migrations. Infelizmente não fiz nenhum post sobre isso. Mas seguem dois links sobre o assunto:
http://blogs.msdn.com/b/adonet/archive/2011/09/21/code-first-migrations-alpha-3-no-magic-walkthrough.aspx
http://blogs.msdn.com/b/adonet/archive/2011/09/21/code-first-migrations-alpha-3-with-magic-walkthrough-automatic-migrations.aspx
[]s!