Поделиться через


Руководство. Начало работы с Entity Framework 6 Code First using 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. Сведения о выборе между кодом 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.

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

    Примечание.

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

  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
    

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

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

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

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

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

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

Основной класс, который координирует функциональные возможности 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и CoursesEnrollments. Вместо этого имена таблиц будут 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 в файле application 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 и добавьте элемент, предшествующий appSettings connectionStrings элементу, как показано в следующем примере. (Убедитесь, что вы обновляете Файл 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. Щелкните правой кнопкой мыши папку "Контроллеры" в Обозреватель решений, выберите "Добавить" и щелкните "Создать шаблонный элемент".

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

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

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

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

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

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

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

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

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

    private SchoolContext db = new SchoolContext();
    

    Метод Index действия получает список учащихся из сущности "Учащиеся ", считывая 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 выполнил метод начального значения, чтобы заполнить базу данных данными.

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

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

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

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

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

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

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

Соглашения

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

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

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

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

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

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

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

Следующие шаги

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

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

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