Tutorial: Introdução ao Entity Framework 6 Code First usando o MVC 5
Observação
Para novos desenvolvimentos, recomendamos ASP.NET Páginas Principais do Razor em vez de ASP.NET controladores e exibições MVC. Para obter uma série de tutoriais semelhante a esta usando 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 MVC 5 ASP.NET que usa o Entity Framework 6 para acesso a dados. Este tutorial usa o fluxo de trabalho do 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 amostra é um site universitário simples. Com ele, você pode visualizar e atualizar informações de alunos, cursos e instrutores. Aqui estão duas das telas que você cria:
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
- Exibição do banco de dados
Pré-requisitos
Criar um aplicativo Web do MVC
Abra o Visual Studio e crie um projeto Web em C# usando o modelo Aplicativo Web ASP.NET (.NET Framework ). Nomeie o projeto como ContosoUniversity e selecione OK.
Em Novo Aplicativo Web ASP.NET – ContosoUniversity, selecione MVC.
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, não restringe o acesso com base em quem está conectado.
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.
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>© @DateTime.Now.Year - Contoso University</p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html>
Em Views\Home\Index.cshtml, substitua o conteúdo do arquivo pelo seguinte código para substituir o texto sobre o ASP.NET e o 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 »</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 »</a></p> </div> </div>
Pressione Ctrl+F5 para executar o site. Você vê a página inicial com o menu principal.
Instalar o Entity Framework 6
No menu Ferramentas, escolha Gerenciador de Pacotes NuGet e, em seguida, escolha Console do Gerenciador de Pacotes.
Na janela Console do Gerenciador de Pacotes , digite o seguinte comando:
Install-Package EntityFramework
Esta etapa é uma das poucas etapas que este tutorial faz com que você execute manualmente, mas que poderia ter sido feita automaticamente pelo recurso de scaffolding MVC ASP.NET. Você está fazendo isso manualmente para que possa ver as etapas necessárias para usar o EF (Entity Framework). Você usará 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, tudo o que você precisa fazer é ignorar essas etapas e criar o 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-Matrícula-Aluno<><>
Entidades | Relação |
---|---|
Curso para Matrícula | Um para muitos |
Aluno para inscrição | 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 terminar de criar 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 no 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 nomeada ID
ou classname ID
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 conterá 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), Student
a propriedade de navegação dessa Enrollments
entidade conterá essas duas Enrollment
entidades.
As propriedades de navegação normalmente são definidas para virtual
que possam aproveitar determinadas funcionalidades do Entity Framework, como carregamento lento. (O carregamento lento será explicado mais tarde, noLendo o tutorial 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 classname ID
em vez de ID
sozinha, 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 o uso ID
de without classname
facilita a implementação da herança no modelo de dados.
A Grade
propriedade é um enum. O ponto de interrogação após a declaração de tipo Grade
indica que a propriedade Grade
permite valor anulável. Uma nota 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 interpretará uma propriedade como uma propriedade de chave estrangeira se ela for nomeada nome da propriedade de navegação nome da propriedade> da 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 da mesma forma simplesmente <nome> de propriedade de 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 DatabaseGeneratedAttribute atributo 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 principal que coordena a funcionalidade do Entity Framework para um determinado modelo de dados é a classe de contexto de banco de dados. Você cria essa classe derivando da classe System.Data.Entity.DbContext . Em seu 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 no Gerenciador de Soluções e clique em Adicionar e, em seguida, clique em Nova Pasta. Nomeie a nova pasta 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 and DbSet<Course>
e funcionaria da mesma forma. O Entity Framework os incluiria implicitamente porque a Student
entidade faz referência à Enrollment
entidade e a entidade faz referência à Enrollment
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 própria cadeia de conexão em vez do nome de uma que está armazenada no arquivo Web.config. Para obter mais informações sobre as 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 é 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 os nomes de tabela sejam pluralizados. Se você não fizer isso, as tabelas geradas no banco de dados serão nomeadas Students
, Courses
, e Enrollments
. Em vez disso, os nomes das tabelas serão Student
, Course
e Enrollment
. Os desenvolvedores não concordam sobre se os nomes de tabela devem ser pluralizados ou não. Este tutorial usa a forma singular, mas o ponto importante é que você pode selecionar a forma de sua preferência 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 é executado. Você pode especificar que isso deve ser feito sempre que seu 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 após a criação do 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 lançar 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 é bom durante o desenvolvimento, porque o Seed
método será executado quando o banco de dados for recriado e recriará seus dados de teste. Mas na produção, você geralmente não quer perder todos os seus dados toda vez que precisar alterar o esquema do banco de dados. Posteriormente, você verá como lidar com alterações de modelo usando Migrações do Code First para alterar o esquema do banco de dados em vez de descartar e recriar o banco de dados.
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 carrega 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 do 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 apropriadaDbSet
e salva as alterações no banco de dados. Não é necessário chamar oSaveChanges
método após cada grupo de entidades, como é feito aqui, mas isso ajuda a localizar a origem de um problema se ocorrer uma exceção enquanto o código estiver gravando no banco de dados.Para instruir o Entity Framework a usar sua classe de inicializador, adicione um elemento ao
entityFramework
elemento no arquivo Web.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 odatabaseinitializer type
nome totalmente qualificado da classe inicializador e do assembly em que ele está. (Quando você não quiser que o EF use o inicializador, você pode definir um atributo nocontext
elemento:disableDatabaseInitialization="true"
.) Para obter mais informações, consulte Definiçõ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 aoApplication_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ê acessar 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 (classes ur SchoolContext
e entity). Se houver uma diferença, o aplicativo descartará e recriará 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 desta série.
Configurar o EF 6 para usar o LocalDB
O LocalDB é uma versão leve do mecanismo de banco de dados do SQL Server Express. É fácil de instalar e configurar, inicia sob demanda e é executado no modo de usuário. O LocalDB é executado em um modo de execução especial do SQL Server Express que permite que você trabalhe 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 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, o 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 não foi projetado para funcionar com o IIS.
Neste tutorial, você trabalhará com o LocalDB. Abra o arquivo Web.config do aplicativo e adicione um
connectionStrings
elemento antes doappSettings
elemento, conforme mostrado no exemplo a seguir. (Certifique-se de atualizar o Web.config na pasta raiz do projeto. Há também 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 em sua 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 do 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 aciona automaticamente a criação do banco de dados. Você começará criando um novo controlador. Mas antes de fazer isso, crie o projeto para disponibilizar as classes de modelo e contexto para o scaffold do controlador MVC.
Clique com o botão direito do mouse na pasta Controladores no Gerenciador de Soluções, selecione Adicionar e clique em Novo Item Scaffolded.
Na caixa de diálogo Adicionar Scaffold , selecione Controlador MVC 5 com exibições, usando o Entity Framework e escolha Adicionar.
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, crie 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: crie sua primeira classe de modelo, não crie uma cadeia de conexão e, na caixa Adicionar Controlador , especifique Novo contexto de dados selecionando o + botão ao lado de Classe de contexto de dados. O scaffolder criará sua
DbContext
classe e sua cadeia de conexão, bem como o controlador e as exibições.
O Visual Studio abre o arquivo Controllers\StudentController.cs . Você vê que uma variável de classe foi criada que instancia 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 do conjunto de entidades Students lendo aStudents
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> }
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 da estreita janela do navegador, você verá o link da guia Aluno na barra de endereço superior ou terá que clicar no canto superior direito para ver o link.
Exibição do 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 banco de dados e criou um. Em seguida, o EF executou o método de semente para preencher o banco de dados com dados.
Você pode usar o Gerenciador de Servidores ou o SSOX (Pesquisador de Objetos do SQL Server) para exibir o banco de dados no Visual Studio. Para este tutorial, você usará o Gerenciador de Servidores.
Feche o navegador.
No Gerenciador de Servidores, expanda Conexões de Dados (talvez seja necessário selecionar o botão de atualização primeiro), expanda Contexto Escolar (ContosoUniversity) e, em seguida, expanda Tabelas para ver as tabelas em seu novo banco de dados.
Clique com o botão direito do mouse na tabela Aluno e clique em Mostrar Dados da Tabela para ver as colunas que foram criadas e as linhas que foram inseridas na tabela.
Feche a conexão do Gerenciador de Servidores.
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ê teve que 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ê tenha conhecimento deles:
- 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çãoStudent
, pois a chave primária da entidadeStudent
éID
). As propriedades de chave estrangeira também podem ser nomeadas da mesma forma simplesmente <nome de propriedade de chave primária (por exemplo,EnrollmentID
já que aEnrollment
chave primária da entidade éEnrollmentID
> ).
Você viu que as convenções podem ser anuladas. Por exemplo, você especificou que os nomes de tabela não devem ser pluralizados e verá mais tarde como marcar explicitamente uma propriedade como uma propriedade de chave estrangeira.
Obter o código
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
- Estrutura de Entidade 6 instalada
- 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.