Code First para um banco de dados existente
Esse passo a passo fornece uma introdução ao desenvolvimento Code First direcionado a um banco de dados existente. O Code First permite que você defina seu modelo usando classes C# ou VB.Net. Opcionalmente, a configuração adicional pode ser executada usando atributos em suas classes e propriedades ou usando uma API fluente.
Pré-Requisitos
Você precisará ter o Visual Studio 2012 ou Visual Studio 2013 instalado para concluir esse passo a passo.
Você também precisará da versão 6.1 (ou posterior) do Entity Framework Tools for Visual Studio instalada. Consulte Obter o Entity Framework para obter informações sobre como instalar a versão mais recente das Ferramentas do Entity Framework.
1. Criar um banco de dados existente
Normalmente, quando você está direcionando um banco de dados existente, ele já será criado, mas para esse passo a passo, precisamos criar um banco de dados para acessar.
Vamos em frente e gerar o banco de dados.
Abra o Visual Studio
Exibir ->Gerenciador de Servidores
Clique com o botão direito do mouse em Conexões de Dados –> Adicionar conexão...
Se você não tiver se conectado a um banco de dados do Gerenciador de Servidores antes precisará selecionar Microsoft SQL Server como a fonte de dados
Conecte-se à instância do LocalDB e insira Blogging como o nome do banco de dados
Selecione OK e você será perguntado se deseja criar um novo banco de dados, selecione Sim
O novo banco de dados agora aparecerá no Gerenciador de Servidores, clique com o botão direito do mouse nele e selecione Nova Consulta
Copie o seguinte SQL para a nova consulta, clique com o botão direito do mouse na consulta e selecione Executar
CREATE TABLE [dbo].[Blogs] (
[BlogId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (200) NULL,
[Url] NVARCHAR (200) NULL,
CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);
CREATE TABLE [dbo].[Posts] (
[PostId] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (200) NULL,
[Content] NTEXT NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
);
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')
2. Criar o aplicativo
Para manter as coisas simples, vamos criar um aplicativo de console básico que usa Code First para fazer o acesso aos dados:
- Abra o Visual Studio
- Arquivo -> Novo -> Projeto
- Selecione Windows no menu à esquerda e Aplicativo de Console
- Digite CodeFirstExistingDatabaseSample como o nome
- Selecione OK
3. Modelo de Engenharia Reversa
Usaremos o Entity Framework Tools for Visual Studio para nos ajudar a gerar algum código inicial para mapear para o banco de dados. Essas ferramentas estão apenas gerando código que você também pode digitar manualmente, se preferir.
Projeto –> Adicionar novo item...
Selecione Dados no menu esquerdo e Modelo de Dados de Entidade ADO.NET
Digite BloggingContext como o nome e clique em OK
Isso inicia o Assistente do Modelo de Dados de Entidade
Selecione Code First do banco de dados e clique em Avançar
Selecione a conexão com o banco de dados criado na primeira seção e clique em Avançar
Clique na caixa de seleção ao lado de Tabelas para importar todas as tabelas e clique em Concluir
Depois que o processo de engenheiro reverso for concluído, vários itens serão adicionados ao projeto, vamos dar uma olhada no que foi adicionado.
Arquivo de configuração
Um arquivo App.config foi adicionado ao projeto, esse arquivo contém a cadeia de conexão com o banco de dados existente.
<connectionStrings>
<add
name="BloggingContext"
connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
Você notará algumas outras configurações no arquivo de configuração também, essas são as configurações padrão do EF que informam ao Code First onde criar bancos de dados. Como estamos mapeando para um banco de dados existente, essas configurações serão ignoradas em nosso aplicativo.
Contexto derivado
Uma classe BloggingContext foi adicionada ao projeto. O contexto representa uma sessão com o banco de dados, permitindo consultar e salvar dados. O contexto expõe um DbSet<TEntity> para cada tipo em nosso modelo. Você também notará que o construtor padrão chama um construtor base usando a sintaxe name=. Isso informa ao Code First que a cadeia de conexão a ser usada para esse contexto deve ser carregada do arquivo de configuração.
public partial class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingContext")
{
}
public virtual DbSet<Blog> Blogs { get; set; }
public virtual DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
Você sempre deve usar a sintaxe name= quando estiver usando uma cadeia de conexão no arquivo de configuração. Isso garante que, se a cadeia de conexão não estiver presente, o Entity Framework será lançado em vez de criar um novo banco de dados por convenção.
Classes de modelo
Finalmente, uma classe Blog e Post também foram adicionadas ao projeto. Essas são as classes de domínio que compõem nosso modelo. Você verá anotações de dados aplicadas às classes para especificar a configuração em que as convenções Code First não se alinhariam à estrutura do banco de dados existente. Por exemplo, você verá a anotação StringLength em Blog.Name e Blog.Url já que eles têm um comprimento máximo de 200 no banco de dados (o padrão Code First é usar o comprimento máximo suportado pelo provedor de banco de dados - nvarchar(max) no SQL Server).
public partial class Blog
{
public Blog()
{
Posts = new HashSet<Post>();
}
public int BlogId { get; set; }
[StringLength(200)]
public string Name { get; set; }
[StringLength(200)]
public string Url { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
4. Como Ler e Gravar Dados
Agora que temos um modelo, é hora de usá-lo para acessar alguns dados. Implemente o método Main em Program.cs conforme mostrado abaixo. Esse código cria uma nova instância do nosso contexto e a usa para inserir um novo Blog. Em seguida, ele usa uma consulta LINQ para recuperar todos os Blogs do banco de dados ordenados alfabeticamente por Title.
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine();
var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;
Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
Agora você pode executar o aplicativo e testá-lo.
Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...
E se meu banco de dados for alterado?
O assistente Code First to Database foi projetado para gerar um conjunto de classes de ponto de partida que você pode ajustar e modificar. Se o esquema do banco de dados for alterado, você poderá editar manualmente as classes ou executar outra engenharia reversa para substituir as classes.
Usando migrações Code First para um banco de dados existente
Se você quiser usar as Migrações do Code First com um banco de dados existente, consulte Migrações do Code First para um banco de dados existente.
Resumo
Nesse passo a passo, analisamos o desenvolvimento do Code First usando um banco de dados existente. Usamos o Entity Framework Tools for Visual Studio para fazer engenharia reversa de um conjunto de classes mapeadas para o banco de dados e que poderiam ser usadas para armazenar e recuperar dados.