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

Note

Для новой разработки рекомендуется ASP.NET Core Razor Pages с контроллерами и ПРЕДСТАВЛЕНИЯМИ MVC ASP.NET. Серию руководств, аналогичную этой, с помощью 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 и нажмите кнопку ОК.

    Диалоговое окно "Создание проекта" в Visual Studio

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

    Диалоговое окно "Создание веб-приложения" в Visual Studio

    Note

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

  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, чтобы запустить веб-сайт. Домашняя страница отображается в главном меню.

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

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

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

    Install-Package EntityFramework
    

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

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

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

Курс <-> регистрации <-> учащийся

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

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

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

Note

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

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

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

Класс 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 набор сущностей обычно соответствует таблице базы данных, а сущность соответствует строке в таблице.

Note

Можно опустить операторы 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 и классы сущностей). При наличии разницы приложение удаляет и повторно создает базу данных.

Note

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

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

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

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

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

    <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 создаст ее.) Если вы хотите создать базу данных в папке приложения_данных , можно добавить AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf в строку подключения. Дополнительные сведения о строках подключения см. в разделе SQL Server строки подключения для веб-приложений ASP.NET.

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

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

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

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

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

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

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

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

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

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

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

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

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

    private SchoolContext db = new SchoolContext();
    

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

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

    В представлении студент\индекс.кштмл этот список отображается в таблице:

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

    Щелкните вкладку students (учащиеся ), чтобы просмотреть тестовые данные, вставленные методом Seed. В зависимости от того, насколько ограничивается окно браузера, вы увидите ссылку на вкладку Student в верхней адресной строке или щелкните правый верхний угол, чтобы увидеть ссылку.

    Кнопка меню

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

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

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

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

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

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

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

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

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

Соглашения

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

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

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

Получение кода

Скачать завершенный проект

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

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

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

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

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

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