Руководство по началу работы с Entity Framework 6 Code First с помощью MVC 5

Примечание

Для новой разработки рекомендуется ASP.NET Core Razor Pages ASP.NET контроллеров и представлений MVC. Серия руководств, аналогичная этой серии с использованием Razor Pages, см. в руководстве по началу работы с Razor Pages в ASP.NET Core. Новое руководство:

  • проще для выполнения;
  • содержит больше рекомендаций по EF Core;
  • использует более эффективные запросы;
  • более актуально, так как используются новейшие API;
  • охватывает дополнительные возможности;
  • является предпочтительным подходом для разработки новых приложений.

В этой серии руководств вы узнаете, как создать приложение ASP.NET MVC 5, использующее Entity Framework 6 для доступа к данным. В этом руководстве используется рабочий процесс Code First. Сведения о выборе между Code First, Database First и Model First см. в разделе "Создание модели".

В этой серии руководств объясняется, как создать пример приложения Contoso University. Пример приложения — это простой веб-сайт университета. С его помощью вы можете просматривать и обновлять сведения об учащихся, курсах и преподавателях. Ниже приведены два создаваемых экрана:

Students_Index_page

Изменение учащегося

Изучив это руководство, вы:

  • Создание веб-приложения MVC
  • Настройка стиля сайта
  • Установка Entity Framework 6
  • Создание модели данных
  • Создание контекста базы данных
  • Инициализация базы данных с тестовыми данными
  • Настройка EF 6 для использования LocalDB
  • Создание контроллера и представлений
  • Просмотр базы данных

Предварительные требования

Создание веб-приложения MVC

  1. Откройте Visual Studio и создайте веб-проект C# с помощью шаблона ASP.NET веб-приложения (платформа .NET Framework). Назовите проект ContosoUniversity и нажмите кнопку "ОК".

    Диалоговое окно

  2. В новом веб-приложении ASP.NET — ContosoUniversity выберите MVC.

    Диалоговое окно

    Примечание

    По умолчанию для параметра "Проверка подлинности " задано значение "Нет проверки подлинности". В этом руководстве веб-приложение не требует входа пользователей. Кроме того, он не ограничивает доступ в зависимости от того, кто вошел в систему.

  3. Чтобы создать проект, щелкните ОК.

Настройка стиля сайта

Выполните незначительную настройку меню, макета и домашней страницы сайта.

  1. Откройте views\Shared\_Layout.cshtml и внесите следующие изменения:

    • Измените каждое вхождение "Мое приложение ASP.NET" и "Имя приложения" на "Университет Contoso".
    • Добавьте записи меню для учащихся, курсов, преподавателей и отделов и удалите запись контакта.

    Изменения выделены в следующем фрагменте кода:

    <!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. В Представлениях\Home\Index.cshtml замените содержимое файла следующим кодом, чтобы заменить текст о ASP.NET и MVC текстом об этом приложении:

    @{
        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. Нажмите клавиши CTRL+F5, чтобы запустить веб-сайт. Вы увидите домашнюю страницу с главным меню.

Установка Entity Framework 6

  1. В меню "Сервис" выберите диспетчер пакетов NuGet и выберите консоль диспетчера пакетов.

  2. В окне Консоль диспетчера пакетов введите следующую команду:

    Install-Package EntityFramework
    

Этот шаг является одним из нескольких шагов, выполняемых в этом руководстве вручную, но это можно было сделать автоматически с помощью функции формирования шаблонов MVC ASP.NET. Вы выполняете их вручную, чтобы просмотреть действия, необходимые для использования Entity Framework (EF). Позже вы будете использовать формирование шаблонов для создания контроллера и представлений MVC. Альтернативой является возможность автоматической установки пакета NuGet EF, создания класса контекста базы данных и создания строки подключения. Когда вы будете готовы сделать это таким образом, все, что необходимо сделать, это пропустить эти шаги и сформировать шаблон контроллера MVC после создания классов сущностей.

Создание модели данных

Теперь необходимо создать классы сущностей для приложения университета Contoso. Начните с следующих трех сущностей:

Курс< ->Enrollment-Student<>

Entities Связь
Курс для регистрации Один ко многим
Учащийся в регистрацию Один ко многим

Между сущностями Student и Enrollment, а также между сущностями Course и Enrollment существует отношение "один ко многим". Другими словами, учащийся может быть зарегистрирован в любом количестве курсов, а в отдельном курсе может быть зарегистрировано любое количество учащихся.

В следующих разделах вы создадите класс для каждой из этих сущностей.

Примечание

Если вы попытаетесь скомпилировать проект до завершения создания всех этих классов сущностей, вы получите ошибки компилятора.

Сущность Student

  • В папке Models создайте файл класса с именем Student.cs, щелкнув правой кнопкой мыши папку в Обозреватель решений и выбрав "Добавить>класс". Замените код шаблона следующим кодом:

    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; }
        }
    }
    

Свойство ID будет использоваться в качестве столбца первичного ключа в таблице базы данных, соответствующей этому классу. По умолчанию Entity Framework интерпретирует свойство, именованное ID или имяID класса, как первичный ключ.

Свойство Enrollments является свойством навигации. Свойства навигации содержат другие сущности, связанные с этой сущностью. В этом случае Enrollments свойство сущности Student будет содержать все Enrollment сущности, связанные с этой Student сущностью. Другими словами, если заданная Student строка в базе данных содержит две связанные Enrollment строки (строки, содержащие значение первичного ключа учащегося в столбце StudentID внешнего ключа), Student свойство навигации этой сущности Enrollments будет содержать эти две Enrollment сущности.

Свойства навигации обычно определяются так virtual , чтобы они могли воспользоваться преимуществами определенных функций Entity Framework, таких как отложенная загрузка. (Отложенная загрузка будет описана далее в руководстве по чтению связанных данных далее в этой серии.)

Если свойство навигации может содержать несколько сущностей (как в отношениях "многие ко многим" или "один ко многим"), оно должно иметь тип списка, допускающий добавление, удаление и обновление записей, такой как ICollection.

Сущность Enrollment

  • В папке Models создайте файл Enrollment.cs и замените существующий код следующим кодом:

    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; }
        }
    }
    

Свойство EnrollmentID будет первичным ключом; эта сущность использует шаблон имениID класса, а не ID сам по себе, как вы видели в сущности Student . Как правило, следует выбирать один шаблон, который будет использоваться в рамках всей модели данных. В этом случае демонстрируется возможность использования любого из шаблонов. В следующем руководстве вы узнаете, как использовать без IDclassname упрощения реализации наследования в модели данных.

Свойство Grade является перечислением. Знак вопроса после объявления типа Grade указывает, что свойство Gradeдопускает значение NULL. Класс, который имеет значение NULL, отличается от нулевого класса— null означает, что оценка не известна или еще не назначена.

Свойство StudentID представляет собой внешний ключ. Ему соответствует свойство навигации Student. Сущность Enrollment связана с одной сущностью Student, поэтому это свойство может содержать одну сущность Student (в отличие от представленного ранее свойства навигации Student.Enrollments, которое может содержать несколько сущностей Enrollment).

Свойство CourseID представляет собой внешний ключ. Ему соответствует свойство навигации Course. Сущность Enrollment связана с одной сущностью Course.

Entity Framework интерпретирует свойство как свойство внешнего ключа, если оно называется <именем свойства><навигации, имя> свойства первичного ключа (например, StudentID для Student свойства навигации, так как Student первичный ключ сущности ).ID Свойства внешнего ключа также можно назвать таким же просто <именем> свойства первичного ключа (например, CourseID так как Course первичный ключ сущности имеет значение CourseID).

Сущность Course

  • В папке Models создайте Файл Course.cs, заменив код шаблона следующим кодом:

    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; }
        }
    }
    

Свойство Enrollments является свойством навигации. Сущность Course может быть связана с любым числом сущностей Enrollment.

Более подробное описание атрибута DatabaseGeneratedAttribute будет приведено в одном из следующих учебников этой серии. Фактически, этот атрибут позволяет ввести первичный ключ для курса, а не использовать базу данных, чтобы создать его.

Создание контекста базы данных

Основным классом, который координирует функциональные возможности Entity Framework для данной модели данных, является класс контекста базы данных . Этот класс создается путем наследования от класса System.Data.Entity.DbContext . В коде указывается, какие сущности включены в модель данных. Также вы можете настроить реакцию платформы Entity Framework на некоторые события. В этом проекте соответствующий класс называется SchoolContext.

  • Чтобы создать папку в проекте ContosoUniversity, щелкните правой кнопкой мыши проект в Обозреватель решений и выберите команду "Добавить" и выберите команду "Создать папку". Назовите новую папку DAL (для уровня доступа к данным). В этой папке создайте файл класса с именем SchoolContext.cs и замените код шаблона следующим кодом:

    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>();
            }
        }
    }
    

Указание наборов сущностей

Этот код создает свойство DbSet для каждого набора сущностей. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных, а сущность соответствует строке в таблице.

Примечание

Вы можете опустить DbSet<Enrollment> операторы и DbSet<Course> инструкции, и они будут работать одинаково. Entity Framework будет включать их неявно, так как Student сущность ссылается на Enrollment сущность, а Enrollment сущность ссылается на Course сущность.

Указание строки подключения

Имя строки подключения (которую вы добавите в файл Web.config позже) передается конструктору.

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

Можно также передать саму строку подключения, а не имя той, которая хранится в файле Web.config. Дополнительные сведения о параметрах для указания используемой базы данных см. в строках подключения и моделях.

Если не указать строку подключения или имя одной явно, Entity Framework предполагает, что имя строки подключения совпадает с именем класса. Имя строки подключения по умолчанию в этом примере будет SchoolContextтаким же, как указано явным образом.

Указание имен сингулярных таблиц

Оператор modelBuilder.Conventions.Remove в методе OnModelCreating запрещает множественное число имен таблиц. Если вы этого не сделали, созданные таблицы в базе данных будут называться Students, Coursesи Enrollments. Вместо этого имена таблиц будут иметь Studentзначение , Courseи Enrollment. В среде разработчиков нет единого мнения о том, следует ли использовать имена таблиц во множественном числе. В этом руководстве используется единственная форма, но важно выбрать любую форму, которую вы предпочитаете, включив или опустив эту строку кода.

Инициализация базы данных с тестовыми данными

Entity Framework может автоматически создавать (или удалять и повторно создавать) базу данных при запуске приложения. Вы можете указать, что это должно выполняться при каждом запуске приложения или только в том случае, если модель не синхронизирована с существующей базой данных. Вы также можете написать Seed метод, который Entity Framework автоматически вызывает после создания базы данных, чтобы заполнить ее тестовыми данными.

Поведение по умолчанию заключается в создании базы данных только в том случае, если она не существует (и создается исключение, если модель изменилась и база данных уже существует). В этом разделе вы укажете, что база данных должна быть удалена и повторно создана при каждом изменении модели. Удаление базы данных приводит к потере всех данных. Обычно это нормально во время разработки, так как Seed метод будет выполняться при повторном создании базы данных и будет повторно создавать тестовые данные. Но в рабочей среде обычно не требуется терять все данные при каждом изменении схемы базы данных. Далее вы узнаете, как обрабатывать изменения модели с помощью Code First Migrations для изменения схемы базы данных вместо удаления и повторного создания базы данных.

  1. В папке DAL создайте файл класса с именем SchoolInitializer.cs и замените код шаблона следующим кодом, что приводит к созданию базы данных при необходимости и загрузке тестовых данных в новую базу данных.

    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();
            }
        }
    }
    

    Метод Seed принимает объект контекста базы данных в качестве входного параметра, а код в методе использует этот объект для добавления новых сущностей в базу данных. Для каждого типа сущности код создает коллекцию новых сущностей, добавляет их в соответствующее DbSet свойство, а затем сохраняет изменения в базе данных. Не обязательно вызывать SaveChanges метод после каждой группы сущностей, как это делается здесь, но это помогает найти источник проблемы, если возникло исключение во время записи кода в базу данных.

  2. Чтобы указать Entity Framework использовать класс инициализатора, добавьте элемент entityFramework в элемент в файле Web.config приложения (в папке корневого проекта), как показано в следующем примере:

    <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>
    

    Указывает context type полное имя класса контекста и сборку, в которую она находится, и databaseinitializer type указывает полное имя класса инициализатора и сборку, в которую она находится. (Если вы не хотите, чтобы EF использовал инициализатор, можно задать атрибут для context элемента: disableDatabaseInitialization="true".) Дополнительные сведения см. в разделе "Параметры файла конфигурации".

    Альтернативой настройке инициализатора в файлеWeb.config является его выполнение в коде путем добавления Database.SetInitializer инструкции Application_Start в метод в файле Global.asax.cs . Дополнительные сведения см. в разделе "Основные сведения о инициализаторах баз данных" в Entity Framework Code First.

Теперь приложение настроено таким образом, чтобы при первом доступе к базе данных в заданном запуске приложения Entity Framework сравнивала базу данных с моделью (классы сущностей и вашей SchoolContext сущности). Если есть разница, приложение удаляет и повторно создает базу данных.

Примечание

При развертывании приложения на рабочем веб-сервере необходимо удалить или отключить код, который удаляет и повторно создает базу данных. Это можно сделать в следующем руководстве в этой серии.

Настройка EF 6 для использования LocalDB

LocalDB — это упрощенная версия ядра СУБД SQL Server Express. Легко установить и настроить, запускать по запросу и запускаться в пользовательском режиме. LocalDB выполняется в специальном режиме выполнения SQL Server Express, что позволяет работать с базами данных в виде MDF-файлов. Файлы базы данных LocalDB можно поместить в папку App_Data веб-проекта, если вы хотите скопировать базу данных с проектом. Функция экземпляра пользователя в SQL Server Express также позволяет работать с MDF-файлами, но функция экземпляра пользователя является устаревшей. Поэтому для работы с MDF-файлами рекомендуется использовать LocalDB. LocalDB устанавливается по умолчанию в Visual Studio.

Как правило, SQL Server Express не используется для рабочих веб-приложений. LocalDB, в частности, не рекомендуется использовать в рабочей среде с веб-приложением, так как он не предназначен для работы со службами IIS.

  • В этом руководстве вы будете работать с LocalDB. Откройте приложение Web.config файл и добавьте элемент, предшествующий connectionStrings элементу appSettings , как показано в следующем примере. (Обязательно обновите файл Web.config в корневой папке проекта. В вложенной папке Views также есть файлWeb.config, который не требуется обновлять.)

    <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>
    

Добавленная строка подключения указывает, что Entity Framework будет использовать базу данных LocalDB с именем ContosoUniversity1.mdf. (База данных еще не существует, но EF создаст ее.) Если вы хотите создать базу данных в папке App_Data , можно добавить AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf в строку подключения. Дополнительные сведения о строках подключения см. в разделе SQL Server строки подключения для ASP.NET веб-приложений.

На самом деле в файлеWeb.config не требуется строка подключения. Если строка подключения не задана, Entity Framework использует строку подключения по умолчанию на основе класса контекста. Дополнительные сведения см. в разделе Code First to a New Database.

Создание контроллера и представлений

Теперь вы создадите веб-страницу для отображения данных. Процесс запроса данных автоматически активирует создание базы данных. Начните с создания нового контроллера. Но прежде чем это сделать, создайте проект, чтобы сделать модель и контекстные классы доступными для формирования шаблонов контроллера MVC.

  1. Щелкните правой кнопкой мыши папку Controllers в Обозреватель решений, выберите "Добавить" и выберите "Создать шаблонный элемент".

  2. В диалоговом окне "Добавление шаблонов " выберите контроллер MVC 5 с представлениями с помощью Entity Framework и нажмите кнопку "Добавить".

    Диалоговое окно

  3. В диалоговом окне "Добавить контроллер " сделайте следующее, а затем нажмите кнопку "Добавить".

    • Класс модели: Student (ContosoUniversity.Models). (Если этот параметр не отображается в раскрывающемся списке, выполните сборку проекта и повторите попытку.)

    • Класс контекста данных: SchoolContext (ContosoUniversity.DAL).

    • Имя контроллера: StudentController (не StudentsController).

    • Оставьте значения по умолчанию для других полей.

      При нажатии кнопки "Добавить" шаблон создает файл StudentController.cs и набор представлений (CSHTML-файлы ), которые работают с контроллером. В будущем при создании проектов, использующих Entity Framework, можно также воспользоваться некоторыми дополнительными функциями шаблона: создать первый класс модели, не создавать строку подключения, а затем в поле "Добавить контроллер " указать новый контекст данных , нажав + кнопку рядом с классом контекста данных. Шаблон создаст DbContext класс и строку подключения, а также контроллер и представления.

  4. Visual Studio открывает файл Controllers\StudentController.cs . Вы увидите, что была создана переменная класса, которая создает экземпляр объекта контекста базы данных:

    private SchoolContext db = new SchoolContext();
    

    Метод Index действия получает список учащихся из сущности Students , заданной путем чтения Students свойства экземпляра контекста базы данных:

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

    Представление Student\Index.cshtml отображает этот список в таблице:

    <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. Чтобы запустить проект, нажмите сочетание клавиш CTRL+F5. (Если возникает ошибка "Не удается создать теневое копирование", закройте браузер и повторите попытку.)

    Перейдите на вкладку "Учащиеся ", чтобы просмотреть тестовые данные, вставленные методом Seed . В зависимости от того, насколько узким является окно браузера, вы увидите ссылку "Учащийся" в верхней адресной строке или щелкните правый верхний угол, чтобы увидеть ссылку.

    Кнопка меню

Просмотр базы данных

Когда вы запустили страницу "Учащиеся" и приложение попыталось получить доступ к базе данных, EF обнаружила, что база данных не создана и создана. Затем EF выполнил метод начального значения, чтобы заполнить базу данных данными.

Для просмотра базы данных в Visual Studio можно использовать обозреватель серверов или SQL Server обозреватель объектов (SSOX). В этом руководстве вы будете использовать обозреватель серверов.

  1. Закройте браузер.

  2. В обозревателе серверов разверните узел "Подключения к данным" (может потребоваться сначала нажать кнопку обновления), разверните контекст учебного заведения (ContosoUniversity) и разверните "Таблицы ", чтобы просмотреть таблицы в новой базе данных.

  3. Щелкните правой кнопкой мыши таблицу Student и выберите команду "Показать данные таблицы ", чтобы просмотреть созданные столбцы и строки, вставленные в таблицу.

  4. Закройте подключение обозревателя сервера .

Файлы базы данных ContosoUniversity1.mdf и LDF находятся в папке %USERPROFILE%.

Так как вы используете инициализатор DropCreateDatabaseIfModelChanges , теперь можно внести изменения в Student класс, снова запустить приложение, и база данных будет автоматически создана повторно для сопоставления изменений. Например, если добавить EmailAddress свойство в Student класс, снова запустите страницу Students, а затем снова просмотрите таблицу, вы увидите новый EmailAddress столбец.

Соглашения

Объем кода, который необходимо написать, чтобы Платформа Entity Framework могла создавать полную базу данных, минимальна из-за соглашений или предположений, которые делает Entity Framework. Некоторые из них уже были отмечены или были использованы без вашего осознания:

  • Плюрализованные формы имен классов сущностей используются в качестве имен таблиц.
  • В качестве имен столбцов используются имена свойств сущностей.
  • Свойства сущности, именованные ID или именаID классов, распознаются как свойства первичного ключа.
  • Свойство интерпретируется как свойство внешнего ключа, если оно имеет имя <имя_свойства_навигации><имя_свойства_первичного_ключа> (например StudentID для свойства навигации Student, так как сущность Student имеет первичный ключ ID). Свойства внешнего ключа также можно назвать таким же просто <именем> свойства первичного ключа (например, EnrollmentID так как Enrollment первичный ключ сущности имеет значение EnrollmentID).

Вы видели, что соглашения можно переопределить. Например, вы указали, что имена таблиц не должны быть во множественном числе, и позже вы увидите, как явно пометить свойство как свойство внешнего ключа.

Получите код

Скачивание завершенного проекта

Дополнительные ресурсы

Дополнительные сведения о EF 6 см. в следующих статьях:

Дальнейшие действия

Изучив это руководство, вы:

  • Создание веб-приложения MVC
  • Настройка стиля сайта
  • Установленная платформа Entity Framework 6
  • Создание модели данных
  • Создание контекста базы данных
  • Инициализация базы данных с тестовыми данными
  • Настройка EF 6 для использования LocalDB
  • Создание контроллера и представлений
  • Просмотр базы данных

Перейдите к следующей статье, чтобы узнать, как просматривать и настраивать код создания, чтения, обновления, удаления (CRUD) в контроллерах и представлениях.