Руководство. Начало работы с 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. Пример приложения — это простой веб-сайт университета. С его помощью можно просматривать и обновлять сведения об учащихся, курсах и преподавателях. Ниже приведены два экрана, которые вы создаете:

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. В views\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, чтобы запустить веб-сайт. Вы увидите домашнюю страницу с меню main.

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

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

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

    Install-Package EntityFramework
    

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

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

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

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

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

Между сущностями 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 или classnameID в качестве первичного ключа.

Свойство 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 будет первичным ключом. Эта сущность использует шаблон classnameID , а не ID сам по себе, как показано в сущности Student . Как правило, следует выбирать один шаблон, который будет использоваться в рамках всей модели данных. В этом случае демонстрируется возможность использования любого из шаблонов. В следующем руководстве вы узнаете, как использование ID без classname упрощает реализацию наследования в модели данных.

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

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

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

Entity Framework интерпретирует свойство как свойство внешнего ключа, если оно называется <имя><свойства свойства навигации имя свойства первичного ключа> (например, для свойства навигации, StudentID так как Student первичный ключ сущности имеет значение ID).Student Свойства внешнего ключа также могут называться тем же именем <свойства> первичного ключа (например, 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 будет приведено в одном из следующих учебников этой серии. Фактически, этот атрибут позволяет ввести первичный ключ для курса, а не использовать базу данных, чтобы создать его.

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

Класс main, который координирует функциональные возможности 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 приложения и добавьте элемент перед элементом connectionStringsappSettings , как показано в следующем примере. (Обязательно обновите файл Web.config в корневой папке проекта. Во вложенной папке Представления также есть файл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. Щелкните правой кнопкой мыши папку Контроллеры в Обозреватель решений, выберите Добавить, а затем — Создать шаблонный элемент.

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

    Диалоговое окно добавления шаблона в Visual Studio

  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 можно использовать server Обозреватель или SQL Server обозреватель объектов (SSOX). В этом руководстве вы будете использовать server Обозреватель.

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

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

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

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

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

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

Соглашения

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

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

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

Получите код

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

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

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

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

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

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

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