Tutorial: Introdução ao Entity Framework 6 Code First usando o MVC 5

Observação

Para um novo desenvolvimento, recomendamos ASP.NET Core Razor Pages em ASP.NET controladores e exibições MVC. Para obter uma série de tutoriais semelhante a esta usando o Razor Pages, consulte Tutorial: Introdução ao Razor Pages no ASP.NET Core. O novo tutorial:

  • É mais fácil de acompanhar.
  • Fornece mais práticas recomendadas do EF Core.
  • Usa consultas mais eficientes.
  • É mais atual com a API mais recente.
  • Aborda mais recursos.
  • É a abordagem preferencial para o desenvolvimento de novos aplicativos.

Nesta série de tutoriais, você aprenderá a criar um aplicativo ASP.NET MVC 5 que usa o Entity Framework 6 para acesso a dados. Este tutorial usa o fluxo de trabalho Code First. Para obter informações sobre como escolher entre Code First, Database First e Model First, consulte Criar um modelo.

Esta série de tutoriais explica como criar o aplicativo de exemplo da Contoso University. O aplicativo de exemplo é um site universitário simples. Com ele, você pode exibir e atualizar informações de alunos, cursos e instrutores. Aqui estão duas das telas que você cria:

Students_Index_page

Editar Aluno

Neste tutorial, você:

  • Criar um aplicativo Web do MVC
  • Configurar o estilo do site
  • Instalar o Entity Framework 6
  • Criar o modelo de dados
  • Criar o contexto de banco de dados
  • Inicializar o BD com os dados de teste
  • Configurar o EF 6 para usar o LocalDB
  • Criar um controlador e exibições
  • Exibir o banco de dados

Pré-requisitos

Criar um aplicativo Web do MVC

  1. Abra o Visual Studio e crie um projeto Web em C# usando o modelo ASP.NET Aplicativo Web (.NET Framework). Nomeie o projeto ContosoUniversity e selecione OK.

    Caixa de diálogo Novo Projeto no Visual Studio

  2. Em Novo aplicativo Web ASP.NET – ContosoUniversity, selecione MVC.

    Caixa de diálogo Novo aplicativo Web no Visual Studio

    Observação

    Por padrão, a opção Autenticação é definida como Sem Autenticação. Para este tutorial, o aplicativo Web não exige que os usuários entrem. Além disso, ele não restringe o acesso com base em quem está conectado.

  3. Selecione OK para criar o projeto.

Configurar o estilo do site

Algumas alterações simples configurarão o menu do site, o layout e a home page.

  1. Abra Views\Shared\_Layout.cshtml e faça as seguintes alterações:

    • Altere cada ocorrência de "Meu aplicativo ASP.NET" e "Nome do aplicativo" para "Contoso University".
    • Adicione entradas de menu para Alunos, Cursos, Instrutores e Departamentos e exclua a entrada Contato.

    As alterações são realçadas no seguinte snippet de código:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>@ViewBag.Title - Contoso University</title>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
        <div class="navbar navbar-inverse navbar-fixed-top">
            <div class="navbar-inner">
                <div class="container">
                    <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    @Html.ActionLink("Contoso University", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
                    <div class="nav-collapse collapse">
                        <ul class="nav">
                            <li>@Html.ActionLink("Home", "Index", "Home")</li>
                            <li>@Html.ActionLink("About", "About", "Home")</li>
                            <li>@Html.ActionLink("Students", "Index", "Student")</li>
                            <li>@Html.ActionLink("Courses", "Index", "Course")</li>
                            <li>@Html.ActionLink("Instructors", "Index", "Instructor")</li>
                            <li>@Html.ActionLink("Departments", "Index", "Department")</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    
        <div class="container">
            @RenderBody()
            <hr />
            <footer>
                <p>&copy; @DateTime.Now.Year - Contoso University</p>
            </footer>
        </div>
    
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/bootstrap")
        @RenderSection("scripts", required: false)
    </body>
    </html>
    
  2. Em Views\Home\Index.cshtml, substitua o conteúdo do arquivo pelo seguinte código para substituir o texto sobre ASP.NET e MVC pelo texto sobre este aplicativo:

    @{
        ViewBag.Title = "Home Page";
    }
    
    <div class="jumbotron">
        <h1>Contoso University</h1>
    </div>
    <div class="row">
        <div class="col-md-4">
            <h2>Welcome to Contoso University</h2>
            <p>Contoso University is a sample application that
            demonstrates how to use Entity Framework 6 in an 
            ASP.NET MVC 5 web application.</p>
        </div>
        <div class="col-md-4">
            <h2>Build it from scratch</h2>
            <p>You can build the application by following the steps in the tutorial series on the ASP.NET site.</p>
            <p><a class="btn btn-default" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/">See the tutorial &raquo;</a></p>
        </div>
        <div class="col-md-4">
            <h2>Download it</h2>
            <p>You can download the completed project.</p>
            <p><a class="btn btn-default" href="https://webpifeed.blob.core.windows.net/webpifeed/Partners/ASP.NET%20MVC%20Application%20Using%20Entity%20Framework%20Code%20First.zip">Download &raquo;</a></p>
        </div>
    </div>
    
  3. Pressione Ctrl+F5 para executar o site. Você verá a home page com o menu main.

Instalar o Entity Framework 6

  1. No menu Ferramentas , escolha Gerenciador de Pacotes NuGet e, em seguida, escolha Console do Gerenciador de Pacotes.

  2. Na janela Console do Gerenciador de Pacotes , digite o seguinte comando:

    Install-Package EntityFramework
    

Esta etapa é uma das poucas etapas que este tutorial faz manualmente, mas isso poderia ter sido feito automaticamente pelo recurso de scaffolding do ASP.NET MVC. Você está fazendo isso manualmente para que possa ver as etapas necessárias para usar o EF (Entity Framework). Você usará o scaffolding posteriormente para criar o controlador MVC e as exibições. Uma alternativa é permitir que o scaffolding instale automaticamente o pacote NuGet do EF, crie a classe de contexto do banco de dados e crie a cadeia de conexão. Quando estiver pronto para fazer isso dessa maneira, basta ignorar essas etapas e fazer scaffold do controlador MVC depois de criar suas classes de entidade.

Criar o modelo de dados

Em seguida, você criará as classes de entidade para o aplicativo Contoso University. Você começará com as três entidades a seguir:

Curso<->Enrollment-Student<>

Entidades Relação
Curso para Registro Um-para-muitos
Aluno para Registro Um-para-muitos

Há uma relação um-para-muitos entre as entidades Student e Enrollment, e uma relação um-para-muitos entre as entidades Course e Enrollment. Em outras palavras, um aluno pode ser registrado em qualquer quantidade de cursos e um curso pode ter qualquer quantidade de alunos registrados.

Nas seções a seguir, você criará uma classe para cada uma dessas entidades.

Observação

Se você tentar compilar o projeto antes de concluir a criação de todas essas classes de entidade, receberá erros do compilador.

A entidade Student

  • Na pasta Modelos, crie um arquivo de classe chamado Student.cs clicando com o botão direito do mouse na pasta em Gerenciador de Soluções e escolhendo Adicionar>Classe. Substitua o código do modelo pelo seguinte código:

    using System;
    using System.Collections.Generic;
    
    namespace ContosoUniversity.Models
    {
        public class Student
        {
            public int ID { get; set; }
            public string LastName { get; set; }
            public string FirstMidName { get; set; }
            public DateTime EnrollmentDate { get; set; }
            
            public virtual ICollection<Enrollment> Enrollments { get; set; }
        }
    }
    

A propriedade ID se tornará a coluna de chave primária da tabela de banco de dados que corresponde a essa classe. Por padrão, o Entity Framework interpreta uma propriedade chamada ID ou classnameID como a chave primária.

A propriedade Enrollments é uma propriedade de navegação. As propriedades de navegação armazenam outras entidades que estão relacionadas a essa entidade. Nesse caso, a Enrollments propriedade de uma Student entidade manterá todas as Enrollment entidades relacionadas a essa Student entidade. Em outras palavras, se uma determinada Student linha no banco de dados tiver duas linhas relacionadas Enrollment (linhas que contêm o valor da chave primária desse aluno em sua StudentID coluna de chave estrangeira), a Student propriedade de navegação dessa Enrollments entidade conterá essas duas Enrollment entidades.

As propriedades de navegação normalmente são definidas como virtual para que possam aproveitar determinadas funcionalidades do Entity Framework, como o carregamento lento. (O carregamento lento será explicado posteriormente, no tutorial Lendo dados relacionados mais adiante nesta série.)

Se uma propriedade de navegação pode armazenar várias entidades (como em relações muitos para muitos ou um-para-muitos), o tipo precisa ser uma lista na qual entradas podem ser adicionadas, excluídas e atualizadas, como ICollection.

A entidade Enrollment

  • Na pasta Models, crie Enrollment.cs e substitua o código existente pelo seguinte código:

    namespace ContosoUniversity.Models
    {
        public enum Grade
        {
            A, B, C, D, F
        }
    
        public class Enrollment
        {
            public int EnrollmentID { get; set; }
            public int CourseID { get; set; }
            public int StudentID { get; set; }
            public Grade? Grade { get; set; }
            
            public virtual Course Course { get; set; }
            public virtual Student Student { get; set; }
        }
    }
    

A EnrollmentID propriedade será a chave primária; essa entidade usa o padrão classnameID em vez de ID por si mesma, como você viu na Student entidade. Normalmente, você escolhe um padrão e usa-o em todo o modelo de dados. Aqui, a variação ilustra que você pode usar qualquer um dos padrões. Em um tutorial posterior, você verá como usar ID sem classname facilita a implementação da herança no modelo de dados.

A Grade propriedade é uma enumeração . O ponto de interrogação após a declaração de tipo Grade indica que a propriedade Grade permite valor anulável. Uma nota que é nula é diferente de uma nota zero – nulo significa que uma nota não é conhecida ou ainda não foi atribuída.

A propriedade StudentID é uma chave estrangeira e a propriedade de navegação correspondente é Student. Uma entidade Enrollment é associada a uma entidade Student, de modo que a propriedade possa armazenar apenas uma única entidade Student (ao contrário da propriedade de navegação Student.Enrollments que você viu anteriormente, que pode armazenar várias entidades Enrollment).

A propriedade CourseID é uma chave estrangeira e a propriedade de navegação correspondente é Course. Uma entidade Enrollment está associada a uma entidade Course.

O Entity Framework interpreta uma propriedade como uma propriedade de chave estrangeira se ela for nomeada <nome da propriedade de navegação nome><da propriedade> de chave primária (por exemplo, para a Student propriedade de navegação, StudentID já que a Student chave primária da entidade é ID). As propriedades de chave estrangeira também podem ser nomeadas como simplesmente o <nome> da propriedade da chave primária (por exemplo, CourseID já que a Course chave primária da entidade é CourseID).

A entidade Course

  • Na pasta Modelos , crie Course.cs, substituindo o código do modelo pelo seguinte código:

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace ContosoUniversity.Models
    {
        public class Course
        {
            [DatabaseGenerated(DatabaseGeneratedOption.None)]
            public int CourseID { get; set; }
            public string Title { get; set; }
            public int Credits { get; set; }
            
            public virtual ICollection<Enrollment> Enrollments { get; set; }
        }
    }
    

A propriedade Enrollments é uma propriedade de navegação. Uma entidade Course pode estar relacionada a qualquer quantidade de entidades Enrollment.

Falaremos mais sobre o atributo DatabaseGeneratedAttribute em um tutorial posterior desta série. Basicamente, esse atributo permite que você insira a chave primária do curso, em vez de fazer com que ela seja gerada pelo banco de dados.

Criar o contexto de banco de dados

A classe main que coordena a funcionalidade do Entity Framework para um determinado modelo de dados é a classe de contexto do banco de dados. Você cria essa classe derivando da classe System.Data.Entity.DbContext . No código, você especifica quais entidades estão incluídas no modelo de dados. Também personalize o comportamento específico do Entity Framework. Neste projeto, a classe é chamada SchoolContext.

  • Para criar uma pasta no projeto ContosoUniversity, clique com o botão direito do mouse no projeto em Gerenciador de Soluções, clique em Adicionar e clique em Nova Pasta. Nomeie a nova pasta COMO DAL (para Camada de Acesso a Dados). Nessa pasta, crie um novo arquivo de classe chamado SchoolContext.cs e substitua o código do modelo pelo seguinte código:

    using ContosoUniversity.Models;
    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration.Conventions;
    
    namespace ContosoUniversity.DAL
    {
        public class SchoolContext : DbContext
        {
        
            public SchoolContext() : base("SchoolContext")
            {
            }
            
            public DbSet<Student> Students { get; set; }
            public DbSet<Enrollment> Enrollments { get; set; }
            public DbSet<Course> Courses { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            }
        }
    }
    

Especificar conjuntos de entidades

Esse código cria uma propriedade DbSet para cada conjunto de entidades. Na terminologia do Entity Framework, um conjunto de entidades normalmente corresponde a uma tabela de banco de dados e uma entidade corresponde a uma linha na tabela.

Observação

Você pode omitir as DbSet<Enrollment> instruções e DbSet<Course> e elas funcionariam da mesma forma. O Entity Framework os incluiria implicitamente porque a Student entidade faz referência à Enrollment entidade e a Enrollment entidade faz referência à Course entidade.

Especificar a cadeia de conexão

O nome da cadeia de conexão (que você adicionará ao arquivo Web.config posteriormente) é passado para o construtor.

public SchoolContext() : base("SchoolContext")
{
}

Você também pode passar a cadeia de conexão em si em vez do nome de uma armazenada no arquivo Web.config. Para obter mais informações sobre opções para especificar o banco de dados a ser usado, consulte Cadeias de conexão e modelos.

Se você não especificar uma cadeia de conexão ou o nome de uma explicitamente, o Entity Framework pressupõe que o nome da cadeia de conexão seja o mesmo que o nome da classe. O nome da cadeia de conexão padrão neste exemplo seria SchoolContext, o mesmo que você está especificando explicitamente.

Especificar nomes de tabela singulares

A modelBuilder.Conventions.Remove instrução no método OnModelCreating impede que nomes de tabela sejam pluralizados. Se você não fez isso, as tabelas geradas no banco de dados serão nomeadas Students, Coursese Enrollments. Em vez disso, os nomes de tabela serão Student, Coursee Enrollment. Os desenvolvedores não concordam sobre se os nomes de tabela devem ser pluralizados ou não. Este tutorial usa o formulário singular, mas o ponto importante é que você pode selecionar qualquer formulário que preferir incluindo ou omitindo essa linha de código.

Inicializar o BD com os dados de teste

O Entity Framework pode criar automaticamente (ou descartar e recriar) um banco de dados para você quando o aplicativo for executado. Você pode especificar que isso deve ser feito sempre que o aplicativo for executado ou somente quando o modelo estiver fora de sincronia com o banco de dados existente. Você também pode escrever um Seed método que o Entity Framework chama automaticamente depois de criar o banco de dados para preenchê-lo com dados de teste.

O comportamento padrão é criar um banco de dados somente se ele não existir (e gerar uma exceção se o modelo tiver sido alterado e o banco de dados já existir). Nesta seção, você especificará que o banco de dados deve ser descartado e recriado sempre que o modelo for alterado. Descartar o banco de dados causa a perda de todos os seus dados. Isso geralmente está bem durante o desenvolvimento, pois o Seed método será executado quando o banco de dados for recriado e recriará seus dados de teste. Mas, em produção, você geralmente não quer perder todos os seus dados sempre que precisar alterar o esquema de banco de dados. Posteriormente, você verá como lidar com alterações de modelo usando Migrações do Code First para alterar o esquema de banco de dados em vez de descartar e recriar o banco de dados.

  1. Na pasta DAL, crie um novo arquivo de classe chamado SchoolInitializer.cs e substitua o código do modelo pelo código a seguir, o que faz com que um banco de dados seja criado quando necessário e carregue os dados de teste no novo banco de dados.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using ContosoUniversity.Models;
    
    namespace ContosoUniversity.DAL
    {
        public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext>
        {
            protected override void Seed(SchoolContext context)
            {
                var students = new List<Student>
                {
                new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
                new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
                new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
                };
    
                students.ForEach(s => context.Students.Add(s));
                context.SaveChanges();
                var courses = new List<Course>
                {
                new Course{CourseID=1050,Title="Chemistry",Credits=3,},
                new Course{CourseID=4022,Title="Microeconomics",Credits=3,},
                new Course{CourseID=4041,Title="Macroeconomics",Credits=3,},
                new Course{CourseID=1045,Title="Calculus",Credits=4,},
                new Course{CourseID=3141,Title="Trigonometry",Credits=4,},
                new Course{CourseID=2021,Title="Composition",Credits=3,},
                new Course{CourseID=2042,Title="Literature",Credits=4,}
                };
                courses.ForEach(s => context.Courses.Add(s));
                context.SaveChanges();
                var enrollments = new List<Enrollment>
                {
                new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
                new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
                new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
                new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
                new Enrollment{StudentID=3,CourseID=1050},
                new Enrollment{StudentID=4,CourseID=1050,},
                new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
                new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
                new Enrollment{StudentID=6,CourseID=1045},
                new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
                };
                enrollments.ForEach(s => context.Enrollments.Add(s));
                context.SaveChanges();
            }
        }
    }
    

    O Seed método usa o objeto de contexto de banco de dados como um parâmetro de entrada e o código no método usa esse objeto para adicionar novas entidades ao banco de dados. Para cada tipo de entidade, o código cria uma coleção de novas entidades, adiciona-as à propriedade apropriada DbSet e salva as alterações no banco de dados. Não é necessário chamar o SaveChanges método após cada grupo de entidades, como é feito aqui, mas fazer isso ajuda a localizar a origem de um problema se ocorrer uma exceção enquanto o código está gravando no banco de dados.

  2. Para instruir o Entity Framework a usar sua classe de inicializador, adicione um elemento ao entityFramework elemento no arquivo deWeb.config do aplicativo (aquele na pasta raiz do projeto), conforme mostrado no exemplo a seguir:

    <entityFramework>
      <contexts>
        <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
          <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
        </context>
      </contexts>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="v11.0" />
        </parameters>
      </defaultConnectionFactory>
      <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      </providers>
    </entityFramework>
    

    O context type especifica o nome da classe de contexto totalmente qualificado e o assembly em que ele está e especifica o databaseinitializer type nome totalmente qualificado da classe do inicializador e o assembly em que está. (Quando você não quiser que o EF use o inicializador, você pode definir um atributo no context elemento : disableDatabaseInitialization="true".) Para obter mais informações, consulte Configurações do arquivo de configuração.

    Uma alternativa para definir o inicializador no arquivo Web.config é fazer isso no código adicionando uma Database.SetInitializer instrução ao Application_Start método no arquivo Global.asax.cs . Para obter mais informações, consulte Noções básicas sobre inicializadores de banco de dados no Entity Framework Code First.

O aplicativo agora está configurado para que, quando você acessa o banco de dados pela primeira vez em uma determinada execução do aplicativo, o Entity Framework compare o banco de dados com o modelo (suas SchoolContext classes de entidade e ). Se houver uma diferença, o aplicativo descartará e recria o banco de dados.

Observação

Ao implantar um aplicativo em um servidor Web de produção, você deve remover ou desabilitar o código que descarta e recria o banco de dados. Você fará isso em um tutorial posterior nesta série.

Configurar o EF 6 para usar o LocalDB

LocalDB é uma versão leve do mecanismo de banco de dados SQL Server Express. É fácil instalar e configurar, inicia sob demanda e é executado no modo de usuário. O LocalDB é executado em um modo de execução especial de SQL Server Express que permite trabalhar com bancos de dados como arquivos .mdf. Você pode colocar arquivos de banco de dados LocalDB na pasta App_Data de um projeto Web se quiser poder copiar o banco de dados com o projeto. O recurso de instância de usuário no SQL Server Express também permite que você trabalhe com arquivos .mdf, mas o recurso de instância de usuário foi preterido; portanto, o LocalDB é recomendado para trabalhar com arquivos .mdf. O LocalDB é instalado por padrão com o Visual Studio.

Normalmente, SQL Server Express não é usado para aplicativos Web de produção. O LocalDB em particular não é recomendado para uso em produção com um aplicativo Web porque ele não foi projetado para funcionar com o IIS.

  • Neste tutorial, você trabalhará com o LocalDB. Abra o arquivo Web.config aplicativo e adicione um connectionStrings elemento que precede o appSettings elemento , conforme mostrado no exemplo a seguir. (Atualize o arquivo Web.config na pasta raiz do projeto. Também há um arquivo Web.config na subpasta Views que você não precisa atualizar.)

    <connectionStrings>
        <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <appSettings>
      <add key="webpages:Version" value="3.0.0.0" />
      <add key="webpages:Enabled" value="false" />
      <add key="ClientValidationEnabled" value="true" />
      <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    

A cadeia de conexão que você adicionou especifica que o Entity Framework usará um banco de dados LocalDB chamado ContosoUniversity1.mdf. (O banco de dados ainda não existe, mas o EF o criará.) Se você quiser criar o banco de dados na pasta App_Data , poderá adicionar AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf à cadeia de conexão. Para obter mais informações sobre cadeias de conexão, consulte cadeias de conexão SQL Server para aplicativos Web ASP.NET.

Na verdade, você não precisa de uma cadeia de conexão no arquivo Web.config . Se você não fornecer uma cadeia de conexão, o Entity Framework usará uma cadeia de conexão padrão com base em sua classe de contexto. Para obter mais informações, consulte Code First para um novo banco de dados.

Criar um controlador e exibições

Agora você criará uma página da Web para exibir dados. O processo de solicitação dos dados dispara automaticamente a criação do banco de dados. Você começará criando um novo controlador. Mas antes de fazer isso, compile o projeto para disponibilizar o modelo e as classes de contexto para scaffolding do controlador MVC.

  1. Clique com o botão direito do mouse na pasta Controladores no Gerenciador de Soluções, selecione Adicionar e clique em Novo Item Com Scaffolded.

  2. Na caixa de diálogo Adicionar Scaffold , selecione Controlador MVC 5 com exibições, usando o Entity Framework e, em seguida, escolha Adicionar.

    Caixa de diálogo Adicionar Scaffold no Visual Studio

  3. Na caixa de diálogo Adicionar Controlador , faça as seguintes seleções e escolha Adicionar:

    • Classe de modelo: Student (ContosoUniversity.Models). (Se você não vir essa opção na lista suspensa, compile o projeto e tente novamente.)

    • Classe de contexto de dados: SchoolContext (ContosoUniversity.DAL).

    • Nome do controlador: StudentController (não StudentsController).

    • Deixe os valores padrão para os outros campos.

      Quando você clica em Adicionar, o scaffolder cria um arquivo StudentController.cs e um conjunto de exibições (arquivos .cshtml ) que funcionam com o controlador. No futuro, ao criar projetos que usam o Entity Framework, você também poderá aproveitar algumas funcionalidades adicionais do scaffolder: criar sua primeira classe de modelo, não criar uma cadeia de conexão e, na caixa Adicionar Controlador , especificar Novo contexto de dados selecionando o botão ao lado da + classe de contexto Dados. O scaffolder criará sua DbContext classe e sua cadeia de conexão, bem como o controlador e as exibições.

  4. O Visual Studio abre o arquivo Controllers\StudentController.cs . Você verá que uma variável de classe foi criada que cria uma instância de um objeto de contexto de banco de dados:

    private SchoolContext db = new SchoolContext();
    

    O Index método de ação obtém uma lista de alunos da entidade Students definida lendo a Students propriedade da instância de contexto do banco de dados:

    public ViewResult Index()
    {
        return View(db.Students.ToList());
    }
    

    A exibição Student\Index.cshtml exibe esta lista em uma tabela:

    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.LastName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FirstMidName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.EnrollmentDate)
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstMidName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })
            </td>
        </tr>
    }
    
  5. Pressione Ctrl+F5 para executar o projeto. (Se você receber um erro "Não é possível criar Cópia de Sombra", feche o navegador e tente novamente.)

    Clique na guia Alunos para ver os dados de teste inseridos pelo Seed método. Dependendo de quão estreita é a janela do navegador, você verá o link da guia Aluno na barra de endereços superior ou precisará clicar no canto superior direito para ver o link.

    Botão Menu

Exibir o banco de dados

Quando você executou a página Alunos e o aplicativo tentou acessar o banco de dados, o EF descobriu que não havia nenhum banco de dados e criou um. Em seguida, o EF executou o método de semente para popular o banco de dados com dados.

Você pode usar o Servidor Explorer ou o SSOX (SQL Server Pesquisador de Objetos) para exibir o banco de dados no Visual Studio. Para este tutorial, você usará o Explorer do Servidor.

  1. Feche o navegador.

  2. Em Explorer de Servidor, expanda Conexões de Dados (talvez seja necessário selecionar o botão atualizar primeiro), expanda Contexto Escolar (ContosoUniversity) e, em seguida, expanda Tabelas para ver as tabelas em seu novo banco de dados.

  3. Clique com o botão direito do mouse na tabela Student e clique em Mostrar Dados da Tabela para ver as colunas que foram criadas e as linhas que foram inseridas na tabela.

  4. Feche a conexão Explorer servidor.

Os arquivos de banco de dados ContosoUniversity1.mdf e .ldf estão na pasta %USERPROFILE%.

Como você está usando o DropCreateDatabaseIfModelChanges inicializador, agora você pode fazer uma alteração na Student classe , executar o aplicativo novamente e o banco de dados será recriado automaticamente para corresponder à sua alteração. Por exemplo, se você adicionar uma EmailAddress propriedade à Student classe, executar a página Alunos novamente e, em seguida, examinar a tabela novamente, verá uma nova EmailAddress coluna.

Convenções

A quantidade de código que você precisava escrever para que o Entity Framework pudesse criar um banco de dados completo para você é mínima devido a convenções ou suposições que o Entity Framework faz. Alguns deles já foram anotados ou foram usados sem que você os saiba:

  • As formas pluralizadas de nomes de classe de entidade são usadas como nomes de tabela.
  • Os nomes de propriedade de entidade são usados para nomes de coluna.
  • As propriedades de entidade nomeadas ID ou classnameID são reconhecidas como propriedades de chave primária.
  • Uma propriedade é interpretada como sendo de chave estrangeira se for chamada de <nome da propriedade de navegação><nome da propriedade de chave primária> (por exemplo, StudentID para a propriedade de navegação Student, pois a chave primária da entidade Student é ID). As propriedades de chave estrangeira também podem ser nomeadas como simplesmente o <nome> da propriedade da chave primária (por exemplo, EnrollmentID já que a Enrollment chave primária da entidade é EnrollmentID).

Você viu que as convenções podem ser substituídas. Por exemplo, você especificou que os nomes de tabela não devem ser pluralizados e verá posteriormente como marcar explicitamente uma propriedade como uma propriedade de chave estrangeira.

Obter o código

Baixar Projeto Concluído

Recursos adicionais

Para obter mais informações sobre o EF 6, consulte estes artigos:

Próximas etapas

Neste tutorial, você:

  • Criou um aplicativo Web MVC
  • Configurar o estilo do site
  • Entity Framework 6 instalado
  • Adicionou o modelo de dados
  • Criou o contexto de banco de dados
  • Inicializou o BD com os dados de teste
  • Configurar o EF 6 para usar o LocalDB
  • Criou um controlador e exibições
  • Exibiu o banco de dados

Avance para o próximo artigo para saber como revisar e personalizar o código CRUD (criar, ler, atualizar, excluir) em seus controladores e exibições.