Расширение SQL Server для Visual Studio Code
В этой статье показано, как использовать расширение mssql для Visual Studio Code для работы с базами данных в SQL Server в Windows, macOS и Linux, а также в Базе данных SQL Azure, Управляемом экземпляре SQL Azure и Azure Synapse Analytics. Расширение mssql для Visual Studio Code позволяет подключаться к SQL Server, выполнять запросы с помощью Transact-SQL (T-SQL) и просматривать результаты.
Создание или открытие файла SQL
Чтобы выполнять команды mssql и пользоваться технологией IntelliSense для T-SQL в редакторе кода, необходимо выбрать языковой режим SQL.
- Выберите пункт Файл>Создать файл или нажмите клавиши CTRL+N. По умолчанию в Visual Studio Code открывается обычный текстовый файл.
- В нижней строке состояния выберите Обычный текст или нажмите клавиши CTRL+K>M, а затем выберите в раскрывающемся списке языков пункт SQL.
Примечание Если расширение используется впервые, оно устанавливает службу sql Tools в фоновом режиме.
При открытии существующего файла с расширением .sql языковой режим SQL устанавливается автоматически.
Подключение к SQL Server
Чтобы создать профиль подключения и подключиться к SQL Server, выполните указанные ниже действия.

- Нажмите клавиши CTRL+SHIFT+P или F1, чтобы открыть палитру команд.
- Введите sql, чтобы отобразить команды mssql, или введите sqlcon, а затем выберите в раскрывающемся списке пункт MS SQL: подключение.
Примечание Чтобы можно было выполнять команды mssql, необходимо установить фокус на файл SQL, например созданный пустой файл SQL, в редакторе кода.
По умолчанию строка подключения использует порт 1433. Экземпляр SQL Server по умолчанию использует порт 1433, если этот параметр не изменен. Если экземпляр прослушивает порт 1433, порт указывать не нужно.
Совет Если подключиться не удается, попробуйте диагностировать проблему в сообщении об ошибке на панели Вывод в Visual Studio Code. Чтобы открыть панель Вывод, выберите пункт Вид>Вывод. Кроме того, ознакомьтесь с рекомендациями по устранению неполадок с подключением.

Вместо выполнения предыдущих инструкций создавать и изменять профили подключения можно также в файле параметров пользователя (settings.json). Чтобы открыть файл параметров, выберите Файл>Настройки>Параметры. Дополнительные сведения см. в статье Управление профилями подключения.
Шифрование и доверие сертификата сервера
Расширение mssql для VS Code версии 1.17.0 и более поздних версий включает важное изменение в свойстве Encrypt, которое теперь по умолчанию включено (имеет значение True) для подключений поставщика MSSQL, и SQL Server должны быть настроены с сертификатами TLS, подписанными доверенным корневым центром сертификации. Кроме того, если начальная попытка подключения завершается сбоем с включенным шифрованием (по умолчанию), расширение mssql предоставит запрос на уведомление с возможностью попытки подключения с включенным сертификатом сервера доверия. Свойства сертификата сервера Encrypt и Trust также доступны для редактирования вручную в файле параметров пользователя (settings.json). Рекомендуется поддерживать надежное зашифрованное подключение к серверу.

Для пользователей, подключающихся к базе данных Azure SQL, изменения существующих сохраненных подключений не требуются; база данных Azure SQL поддерживает зашифрованные подключения и настраивается с использованием доверенных сертификатов.
Для пользователей, подключающихся к локальной SQL Server или SQL Server на виртуальной машине, если для параметра Шифрование задано значение True, убедитесь, что у вас есть сертификат из доверенного центра сертификации (например, не самозаверяющий сертификат). Кроме того, вы можете подключиться без шифрования (для параметра Encrypt задано значение False) или для доверия сертификату сервера (для параметра Шифрование задано значение True, а для параметра Доверять сертификату сервера — значение True).
Создание базы данных

- В новом файле SQL, открытом ранее, введите sql, чтобы получить список редактируемых фрагментов кода.
- Выберите sqlCreateDatabase.
- Во фрагменте введите TutorialDB вместо DatabaseName:
-- Create a new database called 'TutorialDB' -- Connect to the 'master' database to run this snippet USE master GO IF NOT EXISTS ( SELECT name FROM sys.databases WHERE name = N'TutorialDB' ) CREATE DATABASE [TutorialDB] GO

Нажмите клавиши CTRL+SHIFT+E, чтобы выполнить команды Transact-SQL. Просмотрите результаты в окне запроса.
Совет Сочетания клавиш для команд mssql можно настроить. См. статью Customize Shortcuts (Настройка сочетаний клавиш).
Создание таблицы

- Удалите содержимое в окне редактора кода.
- Нажмите клавиши CTRL+SHIFT+P или F1, чтобы открыть палитру команд.
- Введите sql, чтобы отобразить команды mssql, или введите sqluse, а затем выберите команду MS SQL: использовать базу данных.
- Выберите новую базу данных TutorialDB.
- В редакторе кода введите sql, чтобы отобразить фрагменты кода, выберите фрагмент sqlCreateTable и нажмите клавишу ВВОД.
- Во фрагменте введите Employees в качестве имени таблицы.
- Нажмите клавишу TAB, чтобы перейти к следующему полю, а затем введите dbo в качестве имени схемы.
- Замените определения столбцов следующими столбцами:
EmployeesId INT NOT NULL PRIMARY KEY, Name [NVARCHAR](50) NOT NULL, Location [NVARCHAR](50) NOT NULL
Вставка и запрос
- Добавьте приведенные ниже инструкции, чтобы вставить четыре строки в таблицу Employees.
-- Insert rows into table 'Employees' INSERT INTO Employees ([EmployeesId],[Name],[Location]) VALUES ( 1, N'Jared', N'Australia'), ( 2, N'Nikita', N'India'), ( 3, N'Tom', N'Germany'), ( 4, N'Jake', N'United States') GO -- Query the total count of employees SELECT COUNT(*) as EmployeeCount FROM dbo.Employees; -- Query all employee information SELECT e.EmployeesId, e.Name, e.Location FROM dbo.Employees as e GO

В процессе ввода технология IntelliSense для T-SQL помогает завершать инструкции:
Совет Расширение mssql также предоставляет команды, помогающие создавать инструкции INSERT и SELECT. В предыдущем примере они не использовались.

Просмотр и сохранение результата

- Выберите пункты Вид>Макет редактора>Перевернуть макет, чтобы выбрать макет с вертикальным или горизонтальным разбиением.
- Чтобы свернуть или развернуть панели Результаты и Сообщение, щелкните их заголовки.
Совет Поведение по умолчанию расширения mssql можно настроить. См. статью Customize extension options (Настройка параметров расширения).

Щелкните значок увеличения сетки во второй сетке результатов, чтобы увеличить масштаб.
Примечание Значок увеличения отображается, если скрипт T-SQL создает две или несколько сеток результатов.


Если скрипт SQL может потребоваться позднее для администрирования или более крупного проекта разработки, сохраните его с расширением SQL.
Дальнейшие действия
- Если вы не знакомы с T-SQL, изучите разделы Учебник. Составление инструкций Transact-SQL и Справочник по Transact-SQL (ядро СУБД).
- Разработка для баз данных SQL в Visual Studio Code с помощью расширения «Проекты Баз данных SQL»
- Дополнительные сведения об использовании расширения mssql или участии в его создании см. на вики-сайте проекта расширения mssql.
- Дополнительные сведения об использовании Visual Studio Code см. в документации по Visual Studio Code.
Часть 4. Добавление модели в приложение MVC ASP.NET Core
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.
[!IMPORTANT] > This information relates to a pre-release product that may be substantially modified before it’s commercially released. Microsoft makes no warranties, express or implied, with respect to the information provided here. > > For the current release, see the [.NET 8 version of this article](?view=aspnetcore-8.0&preserve-view=true). . moniker-end —>
Авторы: Рик Андерсон (Rick Anderson) и Джон П. Смит (Jon P Smith)
В этом учебнике добавляются классы для управления фильмами в базе данных. Эти классы представляет уровень модели в приложении MVC.
Эти классы модели используются с Entity Framework Core (EF Core) для работы с базой данных. EF Core — это платформа сопоставления с реляционными объектами (ORM), которая упрощает код доступа к данным, который требуется написать.
Созданные классы модели известны как классы POCO (Plain Old CLR Objects — простые старые объекты CLR). Классы POCO не имеют никакой зависимости EF Core. Эти классы только определяют свойства данных, которые хранятся в базе данных.
В этом руководстве классы моделей создаются сначала и EF Core создают базу данных.
Добавление класса модели данных
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
Щелкните правой кнопкой мыши папку Models и выберите Добавить>Class (Класс). Назовите файл Movie.cs .
Добавьте файл с именем Movie.cs в папку Models .
Щелкните папку «Модели» и выберите «Добавить>пустой класс» нового класса.> Назовите файл Movie.cs .
Models/Movie.cs Обновите файл со следующим кодом:
using System.ComponentModel.DataAnnotations; namespace MvcMovie.Models; public class Movie < public int Id < get; set; >public string? Title < get; set; >[DataType(DataType.Date)] public DateTime ReleaseDate < get; set; >public string? Genre < get; set; >public decimal Price < get; set; >>
Класс Movie содержит поле Id , которое требуется базе данных в качестве первичного ключа.
Атрибут DataType для ReleaseDate указывает тип данных ( Date ). С этим атрибутом:
- Пользователю не требуется вводить сведения о времени в поле даты.
- Отображается только дата, а не время.
DataAnnotations рассматриваются в следующем руководстве.
Знак вопроса после string указывает, что свойство допускает значение NULL. Дополнительные сведения см. в статье Ссылочные типы, допускающие значение NULL.
Добавление пакетов NuGet
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
Visual Studio автоматически устанавливает необходимые пакеты.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool uninstall --global dotnet-aspnet-codegenerator dotnet tool install --global dotnet-aspnet-codegenerator dotnet tool uninstall --global dotnet-ef dotnet tool install --global dotnet-ef dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.EntityFrameworkCore.SQLite dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Tools
Приведенные выше команды добавляют следующие компоненты:
- Средства интерфейса командной строки (CLI) дляEF Core
- средство формирования шаблонов;
- Средства разработки времени для EF Core
- EF Core Поставщик SQLite, который устанавливает EF Core пакет в качестве зависимости.
- Пакеты, необходимые для формирования шаблонов: Microsoft.VisualStudio.Web.CodeGeneration.Design и Microsoft.EntityFrameworkCore.SqlServer .
Рекомендации по конфигурации нескольких сред, позволяющей приложению настраивать свои контексты баз данных в среде, см. в разделе Использование нескольких сред в ASP.NET Core.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
- В меню Проект выберите Управление пакетами NuGet.
- Откройте вкладку Browse (Обзор).
- Выберите » Включить предварительные версии«.
- В поле поиска в правом верхнем углу:
- Введите Microsoft.EntityFrameworkCore.SQLite .
- Чтобы начать поиск, нажмите клавишу возврата .
- Выберите соответствующий пакет NuGet и нажмите кнопку Добавить пакет.

Откроется диалоговое окно Выбор проектов, в котором будет выбран проект MvcMovie . Нажмите кнопку OK.
Откроется диалоговое окно Принятие условий лицензионного соглашения. Просмотрите лицензии, а затем нажмите кнопку Принять.
Повторите приведенные выше шаги, чтобы установить следующие пакеты NuGet:
- Microsoft.VisualStudio.Web.CodeGeneration.Design
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Design
- Microsoft.EntityFrameworkCore.Tools
К предыдущим пакетам относятся следующие:
- EF Core Поставщик SQLite, который устанавливает EF Core пакет в качестве зависимости.
- Пакеты, необходимые для формирования шаблонов: Microsoft.VisualStudio.Web.CodeGeneration.Design и Microsoft.EntityFrameworkCore.SqlServer .
- Средства разработки времени для EF Core.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool uninstall --global dotnet-aspnet-codegenerator dotnet tool install --global dotnet-aspnet-codegenerator --version 8.0.0-preview.* dotnet tool uninstall --global dotnet-ef dotnet tool install --global dotnet-ef --version 8.0.0-preview.*По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Приведенные выше команды добавляют следующие компоненты:
- Средства интерфейса командной строки (CLI) дляEF Core
- средство формирования шаблонов;
Выполните сборку проекта, чтобы проверить его на ошибки компиляции.
Формирования шаблона страниц фильмов
Используйте средство формирования шаблонов, чтобы создать страницы Create , Read , Update и Delete (CRUD) для модели фильма.
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
В Обозревателе решений щелкните правой кнопкой мыши папку Controllers и выберите Добавить > New Scaffolded Item (Создать шаблонный элемент).

В диалоговом окне добавления нового шаблона элемента:
- В левой области выберите «Установить>common>MVC«.
- Выберите контроллер MVC с представлениями с помощью Entity Framework.
- Выберите Добавить.

В диалоговом окне добавления контроллера MVC с представлениями с использованием Entity Framework выполните следующее.
- В раскрывающемся списке Класс модели выберите Фильм (MvcMovie.Models).
- В строке Класс контекста данных щелкните знак плюса (+).
- В диалоговом окне Добавление контекста данных создается имя класса MvcMovie.Data.PagesMovieContext.
- Выберите Добавить.

Если отобразится сообщение об ошибке, выберите Добавить еще раз, чтобы повторить попытку.
Шаблон добавляет следующие пакеты:
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.VisualStudio.Web.CodeGeneration.Design
При формировании шаблонов выполняется создание таких объектов:
- Контроллер фильмов: Controllers/MoviesController.cs
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index: Views/Movies/*.cshtml ;
- класс контекста для базы данных: Data/MvcMovieContext.cs .
При формировании шаблонов выполняются такие действия:
- Вставляет необходимые MvcMovie.csproj ссылки на пакеты в файл проекта.
- Регистрирует контекст базы данных в Program.cs файле.
- добавление строки подключения к базе данных в файл appsettings.json .
Автоматическое создание этих файлов и их обновление называется формированием шаблонов.
Сформированные страницы пока использовать нельзя, так как база данных не существует. Запуск приложения и выбор ссылки Movie App приводит к возникновению сообщения об ошибке Не удается открыть базу данных или no such table: Movie (Такая таблица отсутствует: Movie).
Создайте приложение, чтобы убедиться, что ошибки отсутствуют.
Откройте командное окно в каталоге проекта. Каталог проекта — это каталог, который содержит файлы Program.cs и .csproj .
В MacOS и Linux экспортируйте путь к средству формирования шаблонов:
export PATH=$HOME/.dotnet/tools:$PATHВыполните следующую команду:
dotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovie.Data.MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries --databaseProvider sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. —databaseProvider sqlite Укажите DbContext , следует использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hПри формировании шаблонов выполняется создание таких объектов:
- Контроллер фильмов: Controllers/MoviesController.cs
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index: Views/Movies/*.cshtml ;
- класс контекста для базы данных: Data/MvcMovieContext.cs .
При формировании шаблонов выполняются такие действия:
- Регистрирует контекст базы данных в Program.cs файле
- добавление строки подключения к базе данных в файл appsettings.json .
Автоматическое создание этих файлов и их обновление называется формированием шаблонов.
Сформированные страницы пока использовать нельзя, так как база данных не существует. Запуск приложения и выбор ссылки Movie App приводит к возникновению сообщения об ошибке Не удается открыть базу данных или no such table: Movie (Такая таблица отсутствует: Movie).
Создайте приложение, чтобы убедиться, что ошибки отсутствуют.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Приведенный ниже выделенный код в Program.cs показывает, как использовать SQLite в среде разработки, а SQL Server — в рабочей среде.
var builder = WebApplication.CreateBuilder(args); if (builder.Environment.IsDevelopment()) < builder.Services.AddDbContext(options => options.UseSqlite(builder.Configuration.GetConnectionString("MvcMovieContext"))); > else < builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMvcMovieContext"))); >Откройте командное окно в каталоге проекта. Каталог проекта — это каталог, содержащий .csproj файл.
Экспортируйте путь к средству формирования шаблонов:
export PATH=$HOME/.dotnet/tools:$PATHВыполните следующую команду:
dotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovie.Data.MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. -sqlite Флаг, который определяет, DbContext следует ли использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hПри формировании шаблонов выполняется создание таких объектов:
- Контроллер фильмов: Controllers/MoviesController.cs
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index: Views/Movies/*.cshtml ;
- класс контекста для базы данных: Data/MvcMovieContext.cs .
При формировании шаблонов выполняются такие действия:
- Регистрирует контекст базы данных в Program.cs файле
- добавление строки подключения к базе данных в файл appsettings.json .
Автоматическое создание этих файлов и их обновление называется формированием шаблонов.
Сформированные страницы пока использовать нельзя, так как база данных не существует. Запуск приложения и выбор ссылки Movie App приводит к возникновению сообщения об ошибке Не удается открыть базу данных или no such table: Movie (Такая таблица отсутствует: Movie).
Создайте приложение, чтобы убедиться, что ошибки отсутствуют.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Приведенный ниже выделенный код в Program.cs показывает, как использовать SQLite в среде разработки, а SQL Server — в рабочей среде.
var builder = WebApplication.CreateBuilder(args); if (builder.Environment.IsDevelopment()) < builder.Services.AddDbContext(options => options.UseSqlite(builder.Configuration.GetConnectionString("MvcMovieContext"))); > else < builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMvcMovieContext"))); >Первоначальная миграция
EF CoreИспользуйте функцию миграции для создания базы данных. Миграции — это набор средств, с помощью которых можно создавать и обновлять базы данных в соответствии с моделью данных.
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
Введите в консоли диспетчера пакетов (PMC) следующие команды:
Add-Migration InitialCreate Update-Database- Add-Migration InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Так как это первая миграция, созданный класс содержит код для создания схемы базы данных. Схема базы данных создается на основе модели, указанной в классе MvcMovieContext .
- Update-Database : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Команда Update-Database выдает следующее предупреждение:
Тип хранилища не указан для десятичного свойства Price для типа сущности «Movie». Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. Явным образом укажите тип столбца SQL Server, который может содержать все значения в OnModelCreating с помощью HasColumnType, укажите точность и масштабирование с помощью HasPrecision или настройте преобразователь значений с помощью HasConversion.
Игнорируйте предыдущее предупреждение, оно уже исправлено в следующем учебнике.
Дополнительные сведения о средствах PMC смEF CoreEF Core. в справочнике по средствам PMC в Visual Studio.
Выполните следующие команды интерфейса командной строки .NET:
dotnet ef migrations add InitialCreatedotnet ef database update- ef migrations add InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Это первая миграция, поэтому созданный класс содержит код для создания схемы базы данных. Схема базы данных основана на модели, указанной MvcMovieContext в классе, в Data/MvcMovieContext.cs файле.
- ef database update : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Дополнительные сведения о обслуживании нескольких поставщиков, таких как Microsoft SQL Server и SQLite, см. в разделе «Миграция с несколькими поставщиками».
Тестирование приложения
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
Запустите приложение и выберите ссылку Movie App.
Если вы получите исключение, аналогичное следующему, возможно, вы пропустили Update-Database команду на шаге миграции:
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.Запустите приложение и выберите ссылку Movie App.
Если вы получите исключение, аналогичное следующему, возможно, вы пропустили dotnet ef database update команду на шаге миграции:
SqliteException: SQLite Error 1: 'no such table: Movie'.В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.
Изучение созданного класса контекста базы данных, а также регистрации
При этом EF Coreдоступ к данным выполняется с помощью модели. Модель состоит из классов сущностей и объекта контекста, который представляет сеанс взаимодействия с базой данных. Объект контекста позволяет выполнять запросы и сохранять данные. Контекст базы данных наследуется от Microsoft.EntityFrameworkCore.DbContext и определяет сущности, которые необходимо включить в модель данных.
Создание шаблонов создает класс контекста Data/MvcMovieContext.cs базы данных:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using MvcMovie.Models; namespace MvcMovie.Data < public class MvcMovieContext : DbContext < public MvcMovieContext (DbContextOptionsoptions) : base(options) < >public DbSet Movie < get; set; >> >Внедрение зависимостей
ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как контекст базы данных, регистрируются в di Program.cs . Эти службы предоставляются компонентам, которые запрашивают их через параметры конструктора.
В файле Controllers/MoviesController.cs этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных MvcMovieContext в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
При формировании шаблонов был создан следующий выделенный код в Program.cs :
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));Система конфигурации ASP.NET Core считывает строку подключения к базе данных MvcMovieContext.
Проверка созданной строки подключения к базе данных
При формировании шаблонов в файл appsettings.json была добавлена строка подключения:
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
< "Logging": < "LogLevel": < "Default": "Information", "Microsoft.AspNetCore": "Warning" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db" >>< "Logging": < "LogLevel": < "Default": "Information", "Microsoft.AspNetCore": "Warning" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Data Source=MvcMovie.db" >>При локальной разработке система конфигурации ASP.NET Core считывает ключ ConnectionString из файла appsettings.json .
Класс InitialCreate
Изучите Migrations/_InitialCreate.cs файл миграции:
using System; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace MvcMovie.Migrations < public partial class InitialCreate : Migration < protected override void Up(MigrationBuilder migrationBuilder) < migrationBuilder.CreateTable( name: "Movie", columns: table =>new < "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), Title = table.Column(type: "nvarchar(max)", nullable: true), ReleaseDate = table.Column(type: "datetime2", nullable: false), Genre = table.Column(type: "nvarchar(max)", nullable: true), Price = table.Column(type: "decimal(18,2)", nullable: false) >, constraints: table => < table.PrimaryKey("PK_Movie", x =>x.Id); >); > protected override void Down(MigrationBuilder migrationBuilder) < migrationBuilder.DropTable( name: "Movie"); >> >В предыдущем коде:
- метод InitialCreate.Up создает таблицу Movie и настраивает Id в качестве первичного ключа;
- метод InitialCreate.Down отменяет изменения схемы, внесенные при миграции Up .
Внедрение зависимостей в контроллере
Controllers/MoviesController.cs Откройте файл и проверьте конструктор:
public class MoviesController : Controller
Этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных ( MvcMovieContext ) в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
Протестируйте страницу создания. Введите и отправьте данные.
Протестируйте страницы редактирования, сведений и удаления.
Строго типизированные модели и директива @model
Ранее в этом руководстве вы ознакомились с передачей данных или объектов из контроллера в представление с использованием словаря ViewData . Словарь ViewData представляет собой динамический объект, который реализует удобный механизм позднего связывания для передачи информации в представление.
Модель MVC поддерживает передачу строго типизированных объектов модели в представление. Такой подход обеспечивает проверку кода во время компиляции. Механизм формирования шаблонов передал строго типизированную модель в класс MoviesController и представления.
Изучите созданный метод Details в файле Controllers/MoviesController.cs :
// GET: Movies/Details/5 public async Task Details(int? id) < if (id == null) < return NotFound(); >var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id); if (movie == null) < return NotFound(); >return View(movie); >Параметр id обычно передается в качестве данных маршрута. Например, https://localhost:5001/movies/details/1 задает:
- контроллер к контроллеру movies первый сегмент URL-адреса;
- действие для details , второй сегмент URL-адреса;
- значение 1 для id , последний сегмент URL-адреса.
Параметр id можно передать с помощью строки запроса, как показано в следующем примере:
Параметр id определяется как тип, допускающий значение NULL ( int? ), в случае, если не указано значение id .
Лямбда-выражение передается в метод FirstOrDefaultAsync для выбора записей фильмов, которые соответствуют данным маршрута или значению строки запроса.
var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id);Если фильм найден, экземпляр модели Movie передается в представление Details :
return View(movie);Изучите содержимое файла Views/Movies/Details.cshtml :
@model MvcMovie.Models.Movie @ < ViewData["Title"] = "Details"; >Details
Movie
- model.Title)
- model.Title)
- model.ReleaseDate)
- model.ReleaseDate)
- model.Genre)
- model.Genre)
- model.Price)
- model.Price)
Edit | Back to ListОператор @model в начале файла представления задает тип объекта, который будет ожидаться представлением. При создании контроллера movie был включен следующий оператор @model :
@model MvcMovie.Models.MovieЭта директива @model обеспечивает доступ к фильму, который контроллер передал в представление. Объект Model является строго типизированным. Например, в представлении Details.cshtml код передает каждое поле фильма во вспомогательные функции HTML DisplayNameFor и DisplayFor со строго типизированным объектом Model . Методы Create и Edit и представления также передают объект модели Movie .
Изучите представление Index.cshtml и метод Index в контроллере Movies. Обратите внимание на то, как в коде создается объект List при вызове метода View . Код передает список Movies из метода действия Index в представление:
// GET: Movies public async Task Index()
Код возвращает сведения о проблеме, если Movie свойство контекста данных имеет значение NULL.
Когда контроллер фильмов был создан, шаблон включал следующую @model инструкцию в верхней части Index.cshtml файла:
@model IEnumerable
Эта директива @model обеспечивает доступ к списку фильмов, который контроллер передал в представление с использованием строго типизированного объекта Model . Например, в представлении Index.cshtml код циклически перебирает фильмы с использованием оператора foreach для строго типизированного объекта Model :
@model IEnumerable @ < ViewData["Title"] = "Index"; >Index
Create New
@foreach (var item in Model) <@Html.DisplayNameFor(model => model.Title) @Html.DisplayNameFor(model => model.ReleaseDate) @Html.DisplayNameFor(model => model.Genre) @Html.DisplayNameFor(model => model.Price) >@Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.ReleaseDate) @Html.DisplayFor(modelItem => item.Genre) @Html.DisplayFor(modelItem => item.Price) Edit | Details | Delete Так как объект Model является строго типизированным (как и объект IEnumerable ), каждый элемент в цикле получает тип Movie . Помимо других преимуществ, компилятор проверяет типы, используемые в коде.
Дополнительные ресурсы
- Entity Framework Core для начинающих
- Вспомогательные функции тегов
- Глобализация и локализация
В этом учебнике добавляются классы для управления фильмами в базе данных. Эти классы представляет уровень модели в приложении MVC.
Эти классы модели используются с Entity Framework Core (EF Core) для работы с базой данных. EF Core — это платформа сопоставления с реляционными объектами (ORM), которая упрощает код доступа к данным, который требуется написать.
Созданные классы модели известны как классы POCO (Plain Old CLR Objects — простые старые объекты CLR). Классы POCO не имеют никакой зависимости EF Core. Эти классы только определяют свойства данных, которые хранятся в базе данных.
В этом руководстве классы моделей создаются сначала и EF Core создают базу данных.
Добавление класса модели данных
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
Щелкните правой кнопкой мыши папку Models и выберите Добавить>Class (Класс). Назовите файл Movie.cs .
Добавьте файл с именем Movie.cs в папку Models .
Щелкните папку «Модели» и выберите «Добавить>пустой класс» нового класса.> Назовите файл Movie.cs .
Models/Movie.cs Обновите файл со следующим кодом:
using System.ComponentModel.DataAnnotations; namespace MvcMovie.Models; public class Movie < public int Id < get; set; >public string? Title < get; set; >[DataType(DataType.Date)] public DateTime ReleaseDate < get; set; >public string? Genre < get; set; >public decimal Price < get; set; >>Класс Movie содержит поле Id , которое требуется базе данных в качестве первичного ключа.
Атрибут DataType для ReleaseDate указывает тип данных ( Date ). С этим атрибутом:
- Пользователю не требуется вводить сведения о времени в поле даты.
- Отображается только дата, а не время.
DataAnnotations рассматриваются в следующем руководстве.
Знак вопроса после string указывает, что свойство допускает значение NULL. Дополнительные сведения см. в статье Ссылочные типы, допускающие значение NULL.
Добавление пакетов NuGet
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
Visual Studio автоматически устанавливает необходимые пакеты.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool uninstall --global dotnet-aspnet-codegenerator dotnet tool install --global dotnet-aspnet-codegenerator dotnet tool uninstall --global dotnet-ef dotnet tool install --global dotnet-ef dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.EntityFrameworkCore.SQLite dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.ToolsПриведенные выше команды добавляют следующие компоненты:
- Средства интерфейса командной строки (CLI) дляEF Core
- средство формирования шаблонов;
- Средства разработки времени для EF Core
- EF Core Поставщик SQLite, который устанавливает EF Core пакет в качестве зависимости.
- Пакеты, необходимые для формирования шаблонов: Microsoft.VisualStudio.Web.CodeGeneration.Design и Microsoft.EntityFrameworkCore.SqlServer .
Рекомендации по конфигурации нескольких сред, позволяющей приложению настраивать свои контексты баз данных в среде, см. в разделе Использование нескольких сред в ASP.NET Core.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
В меню Проект выберите Управление пакетами NuGet.
В поле поиска в правом верхнем углу выполните приведенные ниже действия.
- Введите Microsoft.EntityFrameworkCore.SQLite .
- Чтобы начать поиск, нажмите клавишу возврата .
- Выберите соответствующий пакет NuGet и нажмите кнопку Добавить пакет.

Откроется диалоговое окно Выбор проектов, в котором будет выбран проект MvcMovie . Нажмите кнопку OK.
Откроется диалоговое окно Принятие условий лицензионного соглашения. Просмотрите лицензии, а затем нажмите кнопку Принять.
Повторите приведенные выше шаги, чтобы установить следующие пакеты NuGet:
- Microsoft.VisualStudio.Web.CodeGeneration.Design
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Design
К предыдущим пакетам относятся следующие:
- EF Core Поставщик SQLite, который устанавливает EF Core пакет в качестве зависимости.
- Пакеты, необходимые для формирования шаблонов: Microsoft.VisualStudio.Web.CodeGeneration.Design и Microsoft.EntityFrameworkCore.SqlServer .
- Средства разработки времени для EF Core.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool uninstall --global dotnet-aspnet-codegenerator dotnet tool install --global dotnet-aspnet-codegenerator dotnet tool uninstall --global dotnet-ef dotnet tool install --global dotnet-efПриведенные выше команды добавляют следующие компоненты:
- Средства интерфейса командной строки (CLI) дляEF Core
- средство формирования шаблонов;
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Выполните сборку проекта, чтобы проверить его на ошибки компиляции.
Формирования шаблона страниц фильмов
Используйте средство формирования шаблонов, чтобы создать страницы Create , Read , Update и Delete (CRUD) для модели фильма.
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
В Обозревателе решений щелкните правой кнопкой мыши папку Controllers и выберите Добавить > New Scaffolded Item (Создать шаблонный элемент).

В диалоговом окне добавления нового шаблона элемента:
- В левой области выберите «Установить>common>MVC«.
- Выберите контроллер MVC с представлениями с помощью Entity Framework.
- Выберите Добавить.

В диалоговом окне добавления контроллера MVC с представлениями с использованием Entity Framework выполните следующее.
- В раскрывающемся списке Класс модели выберите Фильм (MvcMovie.Models).
- В строке Класс контекста данных щелкните знак плюса (+).
- В диалоговом окне Добавление контекста данных создается имя класса MvcMovie.Data.PagesMovieContext.
- Выберите Добавить.

Если появится сообщение об ошибке, нажмите кнопку «Добавить второй раз», чтобы повторить попытку.
Шаблон добавляет следующие пакеты:
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.VisualStudio.Web.CodeGeneration.Design
При формировании шаблонов выполняется создание таких объектов:
- Контроллер фильмов: Controllers/MoviesController.cs
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index: Views/Movies/*.cshtml ;
- класс контекста для базы данных: Data/MvcMovieContext.cs .
При формировании шаблонов выполняются такие действия:
- Вставляет необходимые MvcMovie.csproj ссылки на пакеты в файл проекта.
- Регистрирует контекст базы данных в Program.cs файле.
- добавление строки подключения к базе данных в файл appsettings.json .
Автоматическое создание этих файлов и их обновление называется формированием шаблонов.
Сформированные страницы пока использовать нельзя, так как база данных не существует. Запуск приложения и выбор ссылки Movie App приводит к возникновению сообщения об ошибке Не удается открыть базу данных или no such table: Movie (Такая таблица отсутствует: Movie).
Создайте приложение, чтобы убедиться, что ошибки отсутствуют.
Откройте командное окно в каталоге проекта. Каталог проекта — это каталог, который содержит файлы Program.cs и .csproj .
В MacOS и Linux экспортируйте путь к средству формирования шаблонов:
export PATH=$HOME/.dotnet/tools:$PATHВыполните следующую команду:
dotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovie.Data.MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries --databaseProvider sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. —databaseProvider sqlite Укажите DbContext , следует использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hПри формировании шаблонов выполняется создание таких объектов:
- Контроллер фильмов: Controllers/MoviesController.cs
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index: Views/Movies/*.cshtml ;
- класс контекста для базы данных: Data/MvcMovieContext.cs .
При формировании шаблонов выполняются такие действия:
- Регистрирует контекст базы данных в Program.cs файле
- добавление строки подключения к базе данных в файл appsettings.json .
Автоматическое создание этих файлов и их обновление называется формированием шаблонов.
Сформированные страницы пока использовать нельзя, так как база данных не существует. Запуск приложения и выбор ссылки Movie App приводит к возникновению сообщения об ошибке Не удается открыть базу данных или no such table: Movie (Такая таблица отсутствует: Movie).
Создайте приложение, чтобы убедиться, что ошибки отсутствуют.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Приведенный ниже выделенный код в Program.cs показывает, как использовать SQLite в среде разработки, а SQL Server — в рабочей среде.
var builder = WebApplication.CreateBuilder(args); if (builder.Environment.IsDevelopment()) < builder.Services.AddDbContext(options => options.UseSqlite(builder.Configuration.GetConnectionString("MvcMovieContext"))); > else < builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMvcMovieContext"))); >Откройте командное окно в каталоге проекта. Каталог проекта — это каталог, содержащий .csproj файл.
Экспортируйте путь к средству формирования шаблонов:
export PATH=$HOME/.dotnet/tools:$PATHВыполните следующую команду:
dotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovie.Data.MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. -sqlite Флаг, который определяет, DbContext следует ли использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hПри формировании шаблонов выполняется создание таких объектов:
- Контроллер фильмов: Controllers/MoviesController.cs
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index: Views/Movies/*.cshtml ;
- класс контекста для базы данных: Data/MvcMovieContext.cs .
При формировании шаблонов выполняются такие действия:
- Регистрирует контекст базы данных в Program.cs файле
- добавление строки подключения к базе данных в файл appsettings.json .
Автоматическое создание этих файлов и их обновление называется формированием шаблонов.
Сформированные страницы пока использовать нельзя, так как база данных не существует. Запуск приложения и выбор ссылки Movie App приводит к возникновению сообщения об ошибке Не удается открыть базу данных или no such table: Movie (Такая таблица отсутствует: Movie).
Создайте приложение, чтобы убедиться, что ошибки отсутствуют.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Приведенный ниже выделенный код в Program.cs показывает, как использовать SQLite в среде разработки, а SQL Server — в рабочей среде.
var builder = WebApplication.CreateBuilder(args); if (builder.Environment.IsDevelopment()) < builder.Services.AddDbContext(options => options.UseSqlite(builder.Configuration.GetConnectionString("MvcMovieContext"))); > else < builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMvcMovieContext"))); >Первоначальная миграция
EF CoreИспользуйте функцию миграции для создания базы данных. Миграции — это набор средств, с помощью которых можно создавать и обновлять базы данных в соответствии с моделью данных.
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
Введите в консоли диспетчера пакетов (PMC) следующие команды:
Add-Migration InitialCreate Update-Database- Add-Migration InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Так как это первая миграция, созданный класс содержит код для создания схемы базы данных. Схема базы данных создается на основе модели, указанной в классе MvcMovieContext .
- Update-Database : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Команда Update-Database выдает следующее предупреждение:
«Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения».
Игнорируйте предыдущее предупреждение, оно уже исправлено в следующем учебнике.
Дополнительные сведения о средствах PMC смEF CoreEF Core. в справочнике по средствам PMC в Visual Studio.
Выполните следующие команды интерфейса командной строки .NET:
dotnet ef migrations add InitialCreatedotnet ef database update- ef migrations add InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Это первая миграция, поэтому созданный класс содержит код для создания схемы базы данных. Схема базы данных основана на модели, указанной MvcMovieContext в классе, в Data/MvcMovieContext.cs файле.
- ef database update : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Дополнительные сведения о обслуживании нескольких поставщиков, таких как Microsoft SQL Server и SQLite, см. в разделе «Миграция с несколькими поставщиками».
Тестирование приложения
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
Запустите приложение и выберите ссылку Movie App.
Если вы получите исключение, аналогичное следующему, возможно, вы пропустили Update-Database команду на шаге миграции:
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.Запустите приложение и выберите ссылку Movie App.
Если вы получите исключение, аналогичное следующему, возможно, вы пропустили dotnet ef database update команду на шаге миграции:
SqliteException: SQLite Error 1: 'no such table: Movie'.В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.
Изучение созданного класса контекста базы данных, а также регистрации
При этом EF Coreдоступ к данным выполняется с помощью модели. Модель состоит из классов сущностей и объекта контекста, который представляет сеанс взаимодействия с базой данных. Объект контекста позволяет выполнять запросы и сохранять данные. Контекст базы данных наследуется от Microsoft.EntityFrameworkCore.DbContext и определяет сущности, которые необходимо включить в модель данных.
Создание шаблонов создает класс контекста Data/MvcMovieContext.cs базы данных:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using MvcMovie.Models; namespace MvcMovie.Data < public class MvcMovieContext : DbContext < public MvcMovieContext (DbContextOptionsoptions) : base(options) < >public DbSet Movie < get; set; >> >Внедрение зависимостей
ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как контекст базы данных, регистрируются в di Program.cs . Эти службы предоставляются компонентам, которые запрашивают их через параметры конструктора.
В файле Controllers/MoviesController.cs этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных MvcMovieContext в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
При формировании шаблонов был создан следующий выделенный код в Program.cs :
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));Система конфигурации ASP.NET Core считывает строку подключения к базе данных MvcMovieContext.
Проверка созданной строки подключения к базе данных
При формировании шаблонов в файл appsettings.json была добавлена строка подключения:
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
< "Logging": < "LogLevel": < "Default": "Information", "Microsoft.AspNetCore": "Warning" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db" >>< "Logging": < "LogLevel": < "Default": "Information", "Microsoft.AspNetCore": "Warning" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Data Source=MvcMovie.db" >>При локальной разработке система конфигурации ASP.NET Core считывает ключ ConnectionString из файла appsettings.json .
Класс InitialCreate
Изучите Migrations/_InitialCreate.cs файл миграции:
using System; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace MvcMovie.Migrations < public partial class InitialCreate : Migration < protected override void Up(MigrationBuilder migrationBuilder) < migrationBuilder.CreateTable( name: "Movie", columns: table =>new < "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), Title = table.Column(type: "nvarchar(max)", nullable: true), ReleaseDate = table.Column(type: "datetime2", nullable: false), Genre = table.Column(type: "nvarchar(max)", nullable: true), Price = table.Column(type: "decimal(18,2)", nullable: false) >, constraints: table => < table.PrimaryKey("PK_Movie", x =>x.Id); >); > protected override void Down(MigrationBuilder migrationBuilder) < migrationBuilder.DropTable( name: "Movie"); >> >В предыдущем коде:
- метод InitialCreate.Up создает таблицу Movie и настраивает Id в качестве первичного ключа;
- метод InitialCreate.Down отменяет изменения схемы, внесенные при миграции Up .
Внедрение зависимостей в контроллере
Controllers/MoviesController.cs Откройте файл и проверьте конструктор:
public class MoviesController : Controller
Этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных ( MvcMovieContext ) в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
Протестируйте страницу создания. Введите и отправьте данные.
Протестируйте страницы редактирования, сведений и удаления.
Строго типизированные модели и директива @model
Ранее в этом руководстве вы ознакомились с передачей данных или объектов из контроллера в представление с использованием словаря ViewData . Словарь ViewData представляет собой динамический объект, который реализует удобный механизм позднего связывания для передачи информации в представление.
Модель MVC поддерживает передачу строго типизированных объектов модели в представление. Такой подход обеспечивает проверку кода во время компиляции. Механизм формирования шаблонов передал строго типизированную модель в класс MoviesController и представления.
Изучите созданный метод Details в файле Controllers/MoviesController.cs :
// GET: Movies/Details/5 public async Task Details(int? id) < if (id == null) < return NotFound(); >var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id); if (movie == null) < return NotFound(); >return View(movie); >Параметр id обычно передается в качестве данных маршрута. Например, https://localhost:5001/movies/details/1 задает:
- контроллер к контроллеру movies первый сегмент URL-адреса;
- действие для details , второй сегмент URL-адреса;
- значение 1 для id , последний сегмент URL-адреса.
Параметр id можно передать с помощью строки запроса, как показано в следующем примере:
Параметр id определяется как тип, допускающий значение NULL ( int? ), в случае, если не указано значение id .
Лямбда-выражение передается в метод FirstOrDefaultAsync для выбора записей фильмов, которые соответствуют данным маршрута или значению строки запроса.
var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id);Если фильм найден, экземпляр модели Movie передается в представление Details :
return View(movie);Изучите содержимое файла Views/Movies/Details.cshtml :
@model MvcMovie.Models.Movie @ < ViewData["Title"] = "Details"; >Details
Movie
- model.Title)
- model.Title)
- model.ReleaseDate)
- model.ReleaseDate)
- model.Genre)
- model.Genre)
- model.Price)
- model.Price)
Edit | Back to ListОператор @model в начале файла представления задает тип объекта, который будет ожидаться представлением. При создании контроллера movie был включен следующий оператор @model :
@model MvcMovie.Models.MovieЭта директива @model обеспечивает доступ к фильму, который контроллер передал в представление. Объект Model является строго типизированным. Например, в представлении Details.cshtml код передает каждое поле фильма во вспомогательные функции HTML DisplayNameFor и DisplayFor со строго типизированным объектом Model . Методы Create и Edit и представления также передают объект модели Movie .
Изучите представление Index.cshtml и метод Index в контроллере Movies. Обратите внимание на то, как в коде создается объект List при вызове метода View . Код передает список Movies из метода действия Index в представление:
// GET: Movies public async Task Index()
Код возвращает сведения о проблеме, если Movie свойство контекста данных имеет значение NULL.
Когда контроллер фильмов был создан, шаблон включал следующую @model инструкцию в верхней части Index.cshtml файла:
@model IEnumerable
Эта директива @model обеспечивает доступ к списку фильмов, который контроллер передал в представление с использованием строго типизированного объекта Model . Например, в представлении Index.cshtml код циклически перебирает фильмы с использованием оператора foreach для строго типизированного объекта Model :
@model IEnumerable @ < ViewData["Title"] = "Index"; >Index
Create New
@foreach (var item in Model) <@Html.DisplayNameFor(model => model.Title) @Html.DisplayNameFor(model => model.ReleaseDate) @Html.DisplayNameFor(model => model.Genre) @Html.DisplayNameFor(model => model.Price) >@Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.ReleaseDate) @Html.DisplayFor(modelItem => item.Genre) @Html.DisplayFor(modelItem => item.Price) Edit | Details | Delete Так как объект Model является строго типизированным (как и объект IEnumerable ), каждый элемент в цикле получает тип Movie . Помимо других преимуществ, компилятор проверяет типы, используемые в коде.
Дополнительные ресурсы
- Entity Framework Core для начинающих
- Вспомогательные функции тегов
- Глобализация и локализация
В этом учебнике добавляются классы для управления фильмами в базе данных. Эти классы представляет уровень модели в приложении MVC.
Эти классы модели используются с Entity Framework Core (EF Core) для работы с базой данных. EF Core — это платформа сопоставления с реляционными объектами (ORM), которая упрощает код доступа к данным, который требуется написать.
Созданные классы модели известны как классы POCO (Plain Old CLR Objects — простые старые объекты CLR). Классы POCO не имеют никакой зависимости EF Core. Эти классы только определяют свойства данных, которые хранятся в базе данных.
В этом руководстве классы моделей создаются сначала и EF Core создают базу данных.
Добавление класса модели данных
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
Щелкните правой кнопкой мыши папку Models и выберите Добавить>Class (Класс). Назовите файл Movie.cs .
Добавьте файл с именем Movie.cs в папку Models .
Сведения о Visual Studio для Mac см. в этой версии .NET 7.
**Add** > **New Class** > **Empty Class**. Name the file `Movie.cs`. —>
Models/Movie.cs Обновите файл со следующим кодом:
using System.ComponentModel.DataAnnotations; namespace MvcMovie.Models < public class Movie < public int Id < get; set; >public string? Title < get; set; >[DataType(DataType.Date)] public DateTime ReleaseDate < get; set; >public string? Genre < get; set; >public decimal Price < get; set; >> >Класс Movie содержит поле Id , которое требуется базе данных в качестве первичного ключа.
Атрибут DataType для ReleaseDate указывает тип данных ( Date ). С этим атрибутом:
- Пользователю не требуется вводить сведения о времени в поле даты.
- Отображается только дата, а не время.
DataAnnotations рассматриваются в следующем руководстве.
Знак вопроса после string указывает, что свойство допускает значение NULL. Дополнительные сведения см. в статье Ссылочные типы, допускающие значение NULL.
Добавление пакетов NuGet
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов (PMC).

В PMC выполните следующую команду:
Install-Package Microsoft.EntityFrameworkCore.Design Install-Package Microsoft.EntityFrameworkCore.SqlServerПриведенные выше команды добавляют следующие компоненты:
- EF Core Поставщик SQL Server. Пакет поставщика устанавливает EF Core пакет в качестве зависимости.
- Программы, используемые пакетами, устанавливаются автоматически на этапе формирования шаблонов далее в этом учебнике.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool uninstall --global dotnet-aspnet-codegenerator dotnet tool install --global dotnet-aspnet-codegenerator dotnet tool uninstall --global dotnet-ef dotnet tool install --global dotnet-ef dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.EntityFrameworkCore.SQLite dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.EntityFrameworkCore.SqlServerПриведенные выше команды добавляют следующие компоненты:
- Средства интерфейса командной строки (CLI) дляEF Core
- средство формирования шаблонов;
- Средства разработки времени для EF Core
- EF Core Поставщик SQLite, который устанавливает EF Core пакет в качестве зависимости.
- Пакеты, необходимые для формирования шаблонов: Microsoft.VisualStudio.Web.CodeGeneration.Design и Microsoft.EntityFrameworkCore.SqlServer .
Рекомендации по конфигурации нескольких сред, позволяющей приложению настраивать свои контексты баз данных в среде, см. в разделе Использование нескольких сред в ASP.NET Core.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Сведения о Visual Studio для Mac см. в этой версии .NET 7.
Return key to search. * Select the matching NuGet package and select the **Add Package** button.  The **Select Projects** dialog displays, with the `MvcMovie` project selected. Select the **Ok** button. A **License Acceptance** dialog displays. Review the licenses, then select the **Accept** button. Repeat the above steps to install the following NuGet packages: * `Microsoft.VisualStudio.Web.CodeGeneration.Design` * `Microsoft.EntityFrameworkCore.SqlServer` * `Microsoft.EntityFrameworkCore.Design` Run the following .NET CLI command: «`dotnetcli dotnet tool install —global dotnet-aspnet-codegenerator «` The preceding command adds the [aspnet-codegenerator scaffolding tool](xref:fundamentals/tools/dotnet-aspnet-codegenerator). [!INCLUDE[](~/includes/dotnet-tool-install-arch-options.md)] —>
Выполните сборку проекта, чтобы проверить его на ошибки компиляции.
Формирования шаблона страниц фильмов
Используйте средство формирования шаблонов, чтобы создать страницы Create , Read , Update и Delete (CRUD) для модели фильма.
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
В Обозревателе решений щелкните правой кнопкой мыши папку Controllers и выберите Добавить > New Scaffolded Item (Создать шаблонный элемент).

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

В диалоговом окне добавления контроллера MVC с представлениями с использованием Entity Framework выполните следующее.
- В раскрывающемся списке Класс модели выберите Фильм (MvcMovie.Models).
- В строке Класс контекста данных щелкните знак плюса (+).
- В диалоговом окне Добавление контекста данных создается имя класса MvcMovie.Data.PagesMovieContext.
- Выберите Добавить.

Если отобразится сообщение об ошибке, выберите Добавить еще раз, чтобы повторить попытку.
При формировании шаблонов выполняются такие действия:
- Вставляет необходимые MvcMovie.csproj ссылки на пакеты в файл проекта.
- Регистрирует контекст базы данных в Program.cs файле.
- добавление строки подключения к базе данных в файл appsettings.json .
Откройте командное окно в каталоге проекта. Каталог проекта — это каталог, который содержит файлы Program.cs и .csproj .
В MacOS и Linux экспортируйте путь к средству формирования шаблонов:
export PATH=$HOME/.dotnet/tools:$PATHВыполните следующую команду:
dotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. -sqlite Флаг, который определяет, DbContext следует ли использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hИспользование SQLite для среды разработки и SQL Server для рабочей среды
Приведенный ниже выделенный код в Program.cs показывает, как использовать SQLite в среде разработки, а SQL Server — в рабочей среде.
var builder = WebApplication.CreateBuilder(args); if (builder.Environment.IsDevelopment()) < builder.Services.AddDbContext(options => options.UseSqlite(builder.Configuration.GetConnectionString("MvcMovieContext"))); > else < builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMvcMovieContext"))); >При формировании шаблонов выполняются такие действия:
- Регистрирует контекст базы данных в Program.cs файле
- добавление строки подключения к базе данных в файл appsettings.json .
Сведения о Visual Studio для Mac см. в этой версии .NET 7.
into `Startup`. `IWebHostEnvironment` is injected so `ConfigureServices` can use SQLite in development and SQL Server in production. [!code-csharp[](~/tutorials/first-mvc-app/start-mvc/sample/MvcMovie3/StartupDevProd.cs?name=snippet_StartupClass&highlight=3,5,10,16-28)] Scaffolding updates the following: * Registers the database context in `Startup.ConfigureServices` of the `Startup.cs` file. * Adds a database connection string to the `appsettings.json` file. —>
При формировании шаблонов выполняется создание таких объектов:
- Контроллер фильмов: Controllers/MoviesController.cs
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index: Views/Movies/*.cshtml ;
- класс контекста для базы данных: Data/MvcMovieContext.cs .
Автоматическое создание этих файлов и их обновление называется формированием шаблонов.
Сформированные страницы пока использовать нельзя, так как база данных не существует. Запуск приложения и выбор ссылки Movie App приводит к возникновению сообщения об ошибке Не удается открыть базу данных или no such table: Movie (Такая таблица отсутствует: Movie).
Создание приложения
сборка приложения. Компилятор создает несколько предупреждений о том, как обрабатываются значения null . Дополнительные сведения см. в этом описании проблемы на GitHub, а также в статье Ссылочные типы, допускающие значение null.
Чтобы исключить предупреждения из ссылочных типов, допускающих значения NULL, удалите следующую строку из файла MvcMovie.csproj :
enable Мы постараемся исправить эту проблему в следующем выпуске.
Первоначальная миграция
EF CoreИспользуйте функцию миграции для создания базы данных. Миграции — это набор средств, с помощью которых можно создавать и обновлять базы данных в соответствии с моделью данных.
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
Введите в консоли диспетчера пакетов (PMC) следующие команды:
Add-Migration InitialCreate Update-Database- Add-Migration InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Так как это первая миграция, созданный класс содержит код для создания схемы базы данных. Схема базы данных создается на основе модели, указанной в классе MvcMovieContext .
- Update-Database : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Команда Update-Database выдает следующее предупреждение:
«Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения».
Игнорируйте предыдущее предупреждение, оно уже исправлено в следующем учебнике.
Дополнительные сведения о средствах PMC смEF CoreEF Core. в справочнике по средствам PMC в Visual Studio.
Если у вас нет dotnet ef , выполните установку в качестве глобального средства:
dotnet tool install --global dotnet-efДополнительные сведения о интерфейсе командной строки EF Coreсм EF Core . в справочнике по средствам для .NET CLI.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Выполните следующие команды интерфейса командной строки .NET:
dotnet ef migrations add InitialCreate dotnet ef database update- ef migrations add InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Это первая миграция, поэтому созданный класс содержит код для создания схемы базы данных. Схема базы данных основана на модели, указанной MvcMovieContext в классе, в Data/MvcMovieContext.cs файле.
- ef database update : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Тестирование приложения
Запустите приложение и выберите ссылку Movie App.
Если вы получаете такое исключение, как показано ниже, возможно, вы пропустили шаг миграций:
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.SqliteException: SQLite Error 1: 'no such table: Movie'.В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.
Изучение созданного класса контекста базы данных, а также регистрации
При этом EF Coreдоступ к данным выполняется с помощью модели. Модель состоит из классов сущностей и объекта контекста, который представляет сеанс взаимодействия с базой данных. Объект контекста позволяет выполнять запросы и сохранять данные. Контекст базы данных наследуется от Microsoft.EntityFrameworkCore.DbContext и определяет сущности, которые необходимо включить в модель данных.
Создание шаблонов создает класс контекста Data/MvcMovieContext.cs базы данных:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using MvcMovie.Models; namespace MvcMovie.Data < public class MvcMovieContext : DbContext < public MvcMovieContext (DbContextOptionsoptions) : base(options) < >public DbSet Movie < get; set; >> >Внедрение зависимостей
ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как контекст базы данных, регистрируются в di Program.cs . Эти службы предоставляются компонентам, которые запрашивают их через параметры конструктора.
В файле Controllers/MoviesController.cs этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных MvcMovieContext в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
При формировании шаблонов был создан следующий выделенный код в Program.cs :
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext(options => options.UseSqlite(builder.Configuration.GetConnectionString("MvcMovieContext")));Сведения о Visual Studio для Mac см. в этой версии .NET 7.
Система конфигурации ASP.NET Core считывает строку подключения к базе данных MvcMovieContext.
Проверка созданной строки подключения к базе данных
При формировании шаблонов в файл appsettings.json была добавлена строка подключения:
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
< "Logging": < "LogLevel": < "Default": "Information", "Microsoft.AspNetCore": "Warning" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true" >>< "Logging": < "LogLevel": < "Default": "Information", "Microsoft.AspNetCore": "Warning" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Data Source=MvcMovie.db" >>При локальной разработке система конфигурации ASP.NET Core считывает ключ ConnectionString из файла appsettings.json .
Класс InitialCreate
Изучите Migrations/_InitialCreate.cs файл миграции:
using System; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace MvcMovie.Migrations < public partial class InitialCreate : Migration < protected override void Up(MigrationBuilder migrationBuilder) < migrationBuilder.CreateTable( name: "Movie", columns: table =>new < "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), Title = table.Column(type: "nvarchar(max)", nullable: true), ReleaseDate = table.Column(type: "datetime2", nullable: false), Genre = table.Column(type: "nvarchar(max)", nullable: true), Price = table.Column(type: "decimal(18,2)", nullable: false) >, constraints: table => < table.PrimaryKey("PK_Movie", x =>x.Id); >); > protected override void Down(MigrationBuilder migrationBuilder) < migrationBuilder.DropTable( name: "Movie"); >> >В предыдущем коде:
- метод InitialCreate.Up создает таблицу Movie и настраивает Id в качестве первичного ключа;
- метод InitialCreate.Down отменяет изменения схемы, внесенные при миграции Up .
Внедрение зависимостей в контроллере
Controllers/MoviesController.cs Откройте файл и проверьте конструктор:
public class MoviesController : Controller
Этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных ( MvcMovieContext ) в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
Протестируйте страницу создания. Введите и отправьте данные.
Протестируйте страницы редактирования, сведений и удаления.
Строго типизированные модели и директива @model
Ранее в этом руководстве вы ознакомились с передачей данных или объектов из контроллера в представление с использованием словаря ViewData . Словарь ViewData представляет собой динамический объект, который реализует удобный механизм позднего связывания для передачи информации в представление.
Модель MVC поддерживает передачу строго типизированных объектов модели в представление. Такой подход обеспечивает проверку кода во время компиляции. Механизм формирования шаблонов передал строго типизированную модель в класс MoviesController и представления.
Изучите созданный метод Details в файле Controllers/MoviesController.cs :
// GET: Movies/Details/5 public async Task Details(int? id) < if (id == null) < return NotFound(); >var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id); if (movie == null) < return NotFound(); >return View(movie); >Параметр id обычно передается в качестве данных маршрута. Например, https://localhost:5001/movies/details/1 задает:
- контроллер к контроллеру movies первый сегмент URL-адреса;
- действие для details , второй сегмент URL-адреса;
- значение 1 для id , последний сегмент URL-адреса.
Параметр id можно передать с помощью строки запроса, как показано в следующем примере:
Параметр id определяется как тип, допускающий значение NULL ( int? ), в случае, если не указано значение id .
Лямбда-выражение передается в метод FirstOrDefaultAsync для выбора записей фильмов, которые соответствуют данным маршрута или значению строки запроса.
var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id);Если фильм найден, экземпляр модели Movie передается в представление Details :
return View(movie);Изучите содержимое файла Views/Movies/Details.cshtml :
@model MvcMovie.Models.Movie @ < ViewData["Title"] = "Details"; >Details
Movie
- model.Title)
- model.Title)
- model.ReleaseDate)
- model.ReleaseDate)
- model.Genre)
- model.Genre)
- model.Price)
- model.Price)
Edit | Back to ListОператор @model в начале файла представления задает тип объекта, который будет ожидаться представлением. При создании контроллера movie был включен следующий оператор @model :
@model MvcMovie.Models.MovieЭта директива @model обеспечивает доступ к фильму, который контроллер передал в представление. Объект Model является строго типизированным. Например, в представлении Details.cshtml код передает каждое поле фильма во вспомогательные функции HTML DisplayNameFor и DisplayFor со строго типизированным объектом Model . Методы Create и Edit и представления также передают объект модели Movie .
Изучите представление Index.cshtml и метод Index в контроллере Movies. Обратите внимание на то, как в коде создается объект List при вызове метода View . Код передает список Movies из метода действия Index в представление:
// GET: Movies public async Task Index()
Когда контроллер фильмов был создан, шаблон включал следующую @model инструкцию в верхней части Index.cshtml файла:
@model IEnumerable
Эта директива @model обеспечивает доступ к списку фильмов, который контроллер передал в представление с использованием строго типизированного объекта Model . Например, в представлении Index.cshtml код циклически перебирает фильмы с использованием оператора foreach для строго типизированного объекта Model :
@model IEnumerable @ < ViewData["Title"] = "Index"; >Index
Create New
@foreach (var item in Model) <@Html.DisplayNameFor(model => model.Title) @Html.DisplayNameFor(model => model.ReleaseDate) @Html.DisplayNameFor(model => model.Genre) @Html.DisplayNameFor(model => model.Price) >@Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.ReleaseDate) @Html.DisplayFor(modelItem => item.Genre) @Html.DisplayFor(modelItem => item.Price) Edit | Details | Delete Так как объект Model является строго типизированным (как и объект IEnumerable ), каждый элемент в цикле получает тип Movie . Помимо других преимуществ, компилятор проверяет типы, используемые в коде.
Дополнительные ресурсы
- Entity Framework Core для начинающих
- Вспомогательные функции тегов
- Глобализация и локализация
В этом учебнике добавляются классы для управления фильмами в базе данных. Эти классы представляет уровень модели в приложении MVC.
Эти классы модели используются с Entity Framework Core (EF Core) для работы с базой данных. EF Core — это платформа сопоставления с реляционными объектами (ORM), которая упрощает код доступа к данным, который требуется написать.
Созданные классы модели известны как классы POCO (Plain Old CLR Objects — простые старые объекты CLR). Классы POCO не имеют никакой зависимости EF Core. Эти классы только определяют свойства данных, которые хранятся в базе данных.
В этом руководстве классы моделей создаются сначала и EF Core создают базу данных.
Добавление класса модели данных
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
Щелкните правой кнопкой мыши папку Models и выберите Добавить>Class (Класс). Назовите файл Movie.cs .
Добавьте файл с именем Movie.cs в папку Models .
Щелкните папку Models с удержанием клавиши CTRL и выберите Добавить>New Class (Новый класс)>Empty Class (Пустой класс). Назовите файл Movie.cs .
Models/Movie.cs Обновите файл со следующим кодом:
using System; using System.ComponentModel.DataAnnotations; namespace MvcMovie.Models < public class Movie < public int Id < get; set; >public string Title < get; set; >[DataType(DataType.Date)] public DateTime ReleaseDate < get; set; >public string Genre < get; set; >public decimal Price < get; set; >> >Класс Movie содержит поле Id , которое требуется базе данных в качестве первичного ключа.
Атрибут DataType для ReleaseDate указывает тип данных ( Date ). С этим атрибутом:
- Пользователю не требуется вводить сведения о времени в поле даты.
- Отображается только дата, а не время.
DataAnnotations рассматриваются в следующем руководстве.
Добавление пакетов NuGet
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов (PMC).

В PMC выполните следующую команду:
Install-Package Microsoft.EntityFrameworkCore.DesignПриведенные выше команды добавляют следующие компоненты:
- EF Core Поставщик SQL Server. Пакет поставщика устанавливает EF Core пакет в качестве зависимости.
- Программы, используемые пакетами, устанавливаются автоматически на этапе формирования шаблонов далее в этом учебнике.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool install --global dotnet-ef dotnet tool install --global dotnet-aspnet-codegenerator dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.EntityFrameworkCore.SQLite dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.EntityFrameworkCore.SqlServerПриведенные выше команды добавляют следующие компоненты:
- Средства интерфейса командной строки (CLI) дляEF Core
- средство формирования шаблонов;
- Средства разработки времени для EF Core
- EF Core Поставщик SQLite, который устанавливает EF Core пакет в качестве зависимости.
- Пакеты, необходимые для формирования шаблонов: Microsoft.VisualStudio.Web.CodeGeneration.Design и Microsoft.EntityFrameworkCore.SqlServer .
Рекомендации по конфигурации нескольких сред, позволяющей приложению настраивать свои контексты баз данных в среде, см. в разделе Использование нескольких сред в ASP.NET Core.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Если вы сталкиваетесь с ошибкой формирования шаблонов, убедитесь, что моникер целевой платформы (TFM) соответствует версии пакета NuGet в файле проекта. Например, следующий файл проекта использует версию 5.0 для .NET, а также приведенные ниже пакеты NuGet:
net5.0 В меню Проект выберите Управление пакетами NuGet.
В поле поиска в правом верхнем углу выполните приведенные ниже действия.
- Введите Microsoft.EntityFrameworkCore.SQLite .
- Чтобы начать поиск, нажмите клавишу возврата .
- Выберите соответствующий пакет NuGet и нажмите кнопку Добавить пакет.

Откроется диалоговое окно Выбор проектов, в котором будет выбран проект MvcMovie . Нажмите кнопку OK.
Откроется диалоговое окно Принятие условий лицензионного соглашения. Просмотрите лицензии, а затем нажмите кнопку Принять.
Повторите приведенные выше шаги, чтобы установить следующие пакеты NuGet:
- Microsoft.VisualStudio.Web.CodeGeneration.Design
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Design
Выполните следующую команду CLI .NET:
dotnet tool install --global dotnet-aspnet-codegeneratorПо умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Выполните сборку проекта, чтобы проверить его на ошибки компиляции.
Формирования шаблона страниц фильмов
Используйте средство формирования шаблонов, чтобы создать страницы Create , Read , Update и Delete (CRUD) для модели фильма.
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
В Обозревателе решений щелкните правой кнопкой мыши папку Controllers и выберите Добавить > New Scaffolded Item (Создать шаблонный элемент).

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

В диалоговом окне добавления контроллера MVC с представлениями с использованием Entity Framework выполните следующее.
- В раскрывающемся списке Класс модели выберите Фильм (MvcMovie.Models).
- В строке Класс контекста данных щелкните знак плюса (+).
- В диалоговом окне Добавление контекста данных создается имя класса MvcMovie.Data.PagesMovieContext.
- Выберите Добавить.

При формировании шаблонов выполняются такие действия:
- Вставляет необходимые MvcMovie.csproj ссылки на пакеты в файл проекта.
- Регистрирует контекст базы данных в Startup.ConfigureServices файла Startup.cs .
- добавление строки подключения к базе данных в файл appsettings.json .
Откройте командное окно в каталоге проекта. Каталог проекта — это каталог, содержащий Program.cs файл и Startup.cs .csproj файлы.
В MacOS и Linux экспортируйте путь к средству формирования шаблонов:
export PATH=$HOME/.dotnet/tools:$PATHВыполните следующую команду:
dotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. -sqlite Флаг, который определяет, DbContext следует ли использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hИспользование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В примере кода ниже показано, как внедрить IWebHostEnvironment в Startup . Интерфейс IWebHostEnvironment внедрен, поэтому ConfigureServices может использовать SQLite в среде разработки и SQL Server в рабочей среде.
public class Startup < public Startup(IConfiguration configuration, IWebHostEnvironment env) < Environment = env; Configuration = configuration; >public IConfiguration Configuration < get; >public IWebHostEnvironment Environment < get; >public void ConfigureServices(IServiceCollection services) < services.AddControllersWithViews(); services.AddDbContext(options => < var connectionString = Configuration.GetConnectionString("MvcMovieContext"); if (Environment.IsDevelopment()) < options.UseSqlite(connectionString); >else < options.UseSqlServer(connectionString); >>); > public void Configure(IApplicationBuilder app, IWebHostEnvironment env) < if (env.IsDevelopment()) < app.UseDeveloperExceptionPage(); >else < app.UseExceptionHandler("/Home/Error"); app.UseHsts(); >app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => < endpoints.MapControllerRoute( name: "default", pattern: "//"); >); > >При формировании шаблонов выполняются такие действия:
- Регистрирует контекст базы данных в Startup.ConfigureServices файла Startup.cs .
- добавление строки подключения к базе данных в файл appsettings.json .
Откройте командное окно в каталоге проекта. Каталог проекта — это каталог, содержащий Program.cs файл и Startup.cs .csproj файлы.
Экспортируйте путь к средству формирования шаблонов:
export PATH=$HOME/.dotnet/tools:$PATHВыполните следующую команду:
dotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. -sqlite Флаг, который определяет, DbContext следует ли использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hИспользование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В примере кода ниже показано, как внедрить IWebHostEnvironment в Startup . Интерфейс IWebHostEnvironment внедрен, поэтому ConfigureServices может использовать SQLite в среде разработки и SQL Server в рабочей среде.
public class Startup < public Startup(IConfiguration configuration, IWebHostEnvironment env) < Environment = env; Configuration = configuration; >public IConfiguration Configuration < get; >public IWebHostEnvironment Environment < get; >public void ConfigureServices(IServiceCollection services) < services.AddControllersWithViews(); services.AddDbContext(options => < var connectionString = Configuration.GetConnectionString("MvcMovieContext"); if (Environment.IsDevelopment()) < options.UseSqlite(connectionString); >else < options.UseSqlServer(connectionString); >>); > public void Configure(IApplicationBuilder app, IWebHostEnvironment env) < if (env.IsDevelopment()) < app.UseDeveloperExceptionPage(); >else < app.UseExceptionHandler("/Home/Error"); app.UseHsts(); >app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => < endpoints.MapControllerRoute( name: "default", pattern: "//"); >); > >При формировании шаблонов выполняются такие действия:
- Регистрирует контекст базы данных в Startup.ConfigureServices файла Startup.cs .
- добавление строки подключения к базе данных в файл appsettings.json .
При формировании шаблонов выполняется создание таких объектов:
- Контроллер фильмов: Controllers/MoviesController.cs
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index: Views/Movies/*.cshtml ;
- класс контекста для базы данных: Data/MvcMovieContext.cs .
Автоматическое создание этих файлов и их обновление называется формированием шаблонов.
Сформированные страницы пока использовать нельзя, так как база данных не существует. Запуск приложения и выбор ссылки Movie App приводит к возникновению сообщения об ошибке Не удается открыть базу данных или no such table: Movie (Такая таблица отсутствует: Movie).
Первоначальная миграция
EF CoreИспользуйте функцию миграции для создания базы данных. Миграции — это набор средств, с помощью которых можно создавать и обновлять базы данных в соответствии с моделью данных.
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
Введите в консоли диспетчера пакетов (PMC) следующие команды:
Add-Migration InitialCreate Update-Database- Add-Migration InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Так как это первая миграция, созданный класс содержит код для создания схемы базы данных. Схема базы данных создается на основе модели, указанной в классе MvcMovieContext .
- Update-Database : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Команда Update-Database выдает следующее предупреждение:
«Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения».
Игнорируйте предыдущее предупреждение, оно уже исправлено в следующем учебнике.
Дополнительные сведения о средствах PMC смEF CoreEF Core. в справочнике по средствам PMC в Visual Studio.
Если у вас нет dotnet ef , выполните установку в качестве глобального средства:
dotnet tool install --global dotnet-efДополнительные сведения о интерфейсе командной строки EF Coreсм EF Core . в справочнике по средствам для .NET CLI.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Выполните следующие команды интерфейса командной строки .NET:
dotnet ef migrations add InitialCreate dotnet ef database update- ef migrations add InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Это первая миграция, поэтому созданный класс содержит код для создания схемы базы данных. Схема базы данных основана на модели, указанной MvcMovieContext в классе, в Data/MvcMovieContext.cs файле.
- ef database update : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Тестирование приложения
Запустите приложение и выберите ссылку Movie App.
Если вы получаете такое исключение, как показано ниже, возможно, вы пропустили шаг миграций:
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.SqliteException: SQLite Error 1: 'no such table: Movie'.В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.
Изучение созданного класса контекста базы данных, а также регистрации
При этом EF Coreдоступ к данным выполняется с помощью модели. Модель состоит из классов сущностей и объекта контекста, который представляет сеанс взаимодействия с базой данных. Объект контекста позволяет выполнять запросы и сохранять данные. Контекст базы данных наследуется от Microsoft.EntityFrameworkCore.DbContext и определяет сущности, которые необходимо включить в модель данных.
Создание шаблонов создает класс контекста Data/MvcMovieContext.cs базы данных:
using Microsoft.EntityFrameworkCore; using MvcMovie.Models; namespace MvcMovie.Data < public class MvcMovieContext : DbContext < public MvcMovieContext (DbContextOptionsoptions) : base(options) < >public DbSet Movie < get; set; >> >ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как контекст базы данных, должны быть зарегистрированы с помощью DI в Startup . Компоненты, которые используют эти службы, предоставляются через параметры конструктора.
В файле Controllers/MoviesController.cs этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных MvcMovieContext в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
При формировании шаблонов был создан следующий выделенный код в Startup.ConfigureServices :
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
public void ConfigureServices(IServiceCollection services) < services.AddControllersWithViews(); services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext"))); >public void ConfigureServices(IServiceCollection services) < services.AddControllersWithViews(); services.AddDbContext(options => options.UseSqlite(Configuration.GetConnectionString("MvcMovieContext"))); >public void ConfigureServices(IServiceCollection services) < services.AddControllersWithViews(); services.AddDbContext(options => options.UseSqlite(Configuration.GetConnectionString("MvcMovieContext"))); >Система конфигурации ASP.NET Core считывает строку подключения к базе данных MvcMovieContext.
Проверка созданной строки подключения к базе данных
При формировании шаблонов в файл appsettings.json была добавлена строка подключения:
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
< "Logging": < "LogLevel": < "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-1;Trusted_Connection=True;MultipleActiveResultSets=true" >>< "Logging": < "LogLevel": < "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Data Source=MvcMovie.db" >>При локальной разработке система конфигурации ASP.NET Core считывает ключ ConnectionString из файла appsettings.json .
Класс InitialCreate
Изучите Migrations/_InitialCreate.cs файл миграции:
public partial class InitialCreate : Migration < protected override void Up(MigrationBuilder migrationBuilder) < migrationBuilder.CreateTable( name: "Movie", columns: table =>new < "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), Title = table.Column(type: "nvarchar(max)", nullable: true), ReleaseDate = table.Column(type: "datetime2", nullable: false), Genre = table.Column(type: "nvarchar(max)", nullable: true), Price = table.Column(type: "decimal(18,2)", nullable: false) >, constraints: table => < table.PrimaryKey("PK_Movie", x =>x.Id); >); > protected override void Down(MigrationBuilder migrationBuilder) < migrationBuilder.DropTable( name: "Movie"); >>В предыдущем коде:
- метод InitialCreate.Up создает таблицу Movie и настраивает Id в качестве первичного ключа;
- метод InitialCreate.Down отменяет изменения схемы, внесенные при миграции Up .
Внедрение зависимостей в контроллере
Controllers/MoviesController.cs Откройте файл и проверьте конструктор:
public class MoviesController : Controller
Этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных ( MvcMovieContext ) в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
Протестируйте страницу создания. Введите и отправьте данные.
Протестируйте страницы редактирования, сведений и удаления.
Строго типизированные модели и директива @model
Ранее в этом руководстве вы ознакомились с передачей данных или объектов из контроллера в представление с использованием словаря ViewData . Словарь ViewData представляет собой динамический объект, который реализует удобный механизм позднего связывания для передачи информации в представление.
Модель MVC поддерживает передачу строго типизированных объектов модели в представление. Такой подход обеспечивает проверку кода во время компиляции. Механизм формирования шаблонов передал строго типизированную модель в класс MoviesController и представления.
Изучите созданный метод Details в файле Controllers/MoviesController.cs :
// GET: Movies/Details/5 public async Task Details(int? id) < if (id == null) < return NotFound(); >var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id); if (movie == null) < return NotFound(); >return View(movie); >Параметр id обычно передается в качестве данных маршрута. Например, https://localhost:5001/movies/details/1 задает:
- контроллер к контроллеру movies первый сегмент URL-адреса;
- действие для details , второй сегмент URL-адреса;
- значение 1 для id , последний сегмент URL-адреса.
Параметр id можно передать с помощью строки запроса, как показано в следующем примере:
Параметр id определяется как тип, допускающий значение NULL ( int? ), в случае, если не указано значение id .
Лямбда-выражение передается в метод FirstOrDefaultAsync для выбора записей фильмов, которые соответствуют данным маршрута или значению строки запроса.
var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id);Если фильм найден, экземпляр модели Movie передается в представление Details :
return View(movie);Изучите содержимое файла Views/Movies/Details.cshtml :
@model MvcMovie.Models.Movie @ < ViewData["Title"] = "Details"; >Details
Movie
- model.Title)
- model.Title)
- model.ReleaseDate)
- model.ReleaseDate)
- model.Genre)
- model.Genre)
- model.Price)
- model.Price)
Edit | Back to ListОператор @model в начале файла представления задает тип объекта, который будет ожидаться представлением. При создании контроллера movie был включен следующий оператор @model :
@model MvcMovie.Models.MovieЭта директива @model обеспечивает доступ к фильму, который контроллер передал в представление. Объект Model является строго типизированным. Например, в представлении Details.cshtml код передает каждое поле фильма во вспомогательные функции HTML DisplayNameFor и DisplayFor со строго типизированным объектом Model . Методы Create и Edit и представления также передают объект модели Movie .
Изучите представление Index.cshtml и метод Index в контроллере Movies. Обратите внимание на то, как в коде создается объект List при вызове метода View . Код передает список Movies из метода действия Index в представление:
// GET: Movies public async Task Index()
Когда контроллер фильмов был создан, шаблон включал следующую @model инструкцию в верхней части Index.cshtml файла:
@model IEnumerable
Эта директива @model обеспечивает доступ к списку фильмов, который контроллер передал в представление с использованием строго типизированного объекта Model . Например, в представлении Index.cshtml код циклически перебирает фильмы с использованием оператора foreach для строго типизированного объекта Model :
@model IEnumerable @ < ViewData["Title"] = "Index"; >Index
Create New
@foreach (var item in Model) <@Html.DisplayNameFor(model => model.Title) @Html.DisplayNameFor(model => model.ReleaseDate) @Html.DisplayNameFor(model => model.Genre) @Html.DisplayNameFor(model => model.Price) >@Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.ReleaseDate) @Html.DisplayFor(modelItem => item.Genre) @Html.DisplayFor(modelItem => item.Price) Edit | Details | Delete Так как объект Model является строго типизированным (как и объект IEnumerable ), каждый элемент в цикле получает тип Movie . Помимо других преимуществ, компилятор проверяет типы, используемые в коде.
Ведение журнала SQL Entity Framework Core
Конфигурация ведения журналов обычно предоставляется разделом Logging в файлах appsettings..json . Чтобы регистрировать инструкции SQL, добавьте «Microsoft.EntityFrameworkCore.Database.Command»: «Information» в файл appsettings.Development.json :
< "ConnectionStrings": < "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true" >, "Logging": < "LogLevel": < "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" ,"Microsoft.EntityFrameworkCore.Database.Command": "Information" >>, "AllowedHosts": "*" >При использовании приведенного выше кода JSON инструкции SQL отображаются в командной строке и в окне вывода Visual Studio.
Дополнительные сведения см. в статье Ведение журнала в ASP.NET Core и описании этой проблемы GitHub.
Дополнительные ресурсы
- Entity Framework Core для начинающих
- Вспомогательные функции тегов
- Глобализация и локализация
В этом учебнике добавляются классы для управления фильмами в базе данных. Эти классы представляет уровень модели в приложении MVC.
Эти классы модели используются с Entity Framework Core (EF Core) для работы с базой данных. EF Core — это платформа сопоставления с реляционными объектами (ORM), которая упрощает код доступа к данным, который требуется написать.
Созданные классы модели известны как классы POCO (Plain Old CLR Objects — простые старые объекты CLR). Классы POCO не имеют никакой зависимости EF Core. Эти классы только определяют свойства данных, которые хранятся в базе данных.
В этом руководстве классы моделей создаются сначала и EF Core создают базу данных.
Добавление класса модели данных
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
Щелкните правой кнопкой мыши папку Models и выберите Добавить>Class (Класс). Назовите файл Movie.cs .
Добавьте файл с именем Movie.cs в папку Models .
Щелкните правой кнопкой мыши папку Models и выберите Добавить>New Class (Новый класс)>Empty Class (Пустой класс). Назовите файл Movie.cs .
Movie.cs Обновите файл со следующим кодом:
using System; using System.ComponentModel.DataAnnotations; namespace MvcMovie.Models < public class Movie < public int Id < get; set; >public string Title < get; set; >[DataType(DataType.Date)] public DateTime ReleaseDate < get; set; >public string Genre < get; set; >public decimal Price < get; set; >> >Класс Movie содержит поле Id , которое требуется базе данных в качестве первичного ключа.
Атрибут DataType для ReleaseDate указывает тип данных ( Date ). С этим атрибутом:
- пользователю не требуется вводить сведения о времени в поле даты.
- Отображается только дата, а не время.
DataAnnotations рассматриваются в следующем руководстве.
Добавление пакетов NuGet
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов (PMC).

В PMC выполните следующую команду:
Install-Package Microsoft.EntityFrameworkCore.SqlServerПредыдущая команда добавляет EF Core поставщика SQL Server. Пакет поставщика устанавливает EF Core пакет в качестве зависимости. Дополнительные пакеты устанавливаются автоматически на этапе формирования шаблонов далее в этом руководстве.
Выполните следующие команды интерфейса командной строки .NET Core:
dotnet tool install --global dotnet-ef --version 3.1.9 dotnet tool install --global dotnet-aspnet-codegenerator --version 3.1.4 dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 3.1.9 dotnet add package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore --version 3.1.9 dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 3.1.4 dotnet add package Microsoft.EntityFrameworkCore.Design --version 3.1.9 dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 3.1.9 dotnet add package Microsoft.Extensions.Logging.Debug --version 3.1.9Приведенные выше команды добавляют следующие компоненты:
- средство формирования шаблонов;
- средства Entity Framework Core для .NET Core CLI;
- EF Core Поставщик SQLite, который устанавливает EF Core пакет в качестве зависимости.
- Пакеты, необходимые для формирования шаблонов: Microsoft.VisualStudio.Web.CodeGeneration.Design и Microsoft.EntityFrameworkCore.SqlServer .
Рекомендации по конфигурации нескольких сред, позволяющей приложению настраивать свои контексты баз данных в среде, см. в разделе Использование нескольких сред в ASP.NET Core.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Если вы сталкиваетесь с ошибкой формирования шаблонов, убедитесь, что моникер целевой платформы (TFM) соответствует версии пакета NuGet в файле проекта. Например, следующий файл проекта содержит версию 3.1 для .NET Core, а также приведенные ниже пакеты NuGet:
netcoreapp3.1 В меню Проект выберите Управление пакетами NuGet.
В поле Поиск в правом верхнем углу введите Microsoft.EntityFrameworkCore.SQLite и нажмите клавишу возврата. Выберите соответствующий пакет NuGet и нажмите кнопку Добавить пакет.

Откроется диалоговое окно Выбор проектов, в котором будет выбран проект MvcMovie . Нажмите кнопку ОК.
Появится диалоговое окно Принятие условий лицензионного соглашения. Просмотрите лицензии по своему усмотрению, а затем нажмите кнопку Принять.
Повторите приведенные выше шаги, чтобы установить следующие пакеты NuGet:
- Microsoft.VisualStudio.Web.CodeGeneration.Design
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Design
Создание класса контекста для базы данных
Класс контекста базы данных необходим для координации EF Core функций (создание, чтение, обновление, удаление) для Movie модели. Контекст базы данных является производным от Microsoft.EntityFrameworkCore.DbContext сущностей, которые необходимо включить в модель данных.
Создайте папку Data.
Добавьте файл Data/MvcMovieContext.cs с помощью следующего кода:
using Microsoft.EntityFrameworkCore; using MvcMovie.Models; namespace MvcMovie.Data < public class MvcMovieContext : DbContext < public MvcMovieContext (DbContextOptionsoptions) : base(options) < >public DbSet Movie < get; set; >> >Регистрация контекста базы данных
ASP.NET Core поддерживает внедрение зависимостей. Службы (например EF Core , контекст базы данных) должны быть зарегистрированы в di во время запуска приложения. Затем компоненты, которые используют эти службы (например, Razor Pages), предоставляются через параметры конструктора. Код конструктора, который получает экземпляр контекста базы данных, приведен далее в этом руководстве. В этом разделе контекст базы данных регистрируется в контейнере внедрения зависимостей.
Добавьте следующие инструкции using в начало файла Startup.cs :
using MvcMovie.Data; using Microsoft.EntityFrameworkCore;Добавьте выделенный ниже код в Startup.ConfigureServices :
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
public void ConfigureServices(IServiceCollection services) < services.AddControllersWithViews(); services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext"))); >public void ConfigureServices(IServiceCollection services) < services.AddControllersWithViews(); services.AddDbContext(options => options.UseSqlite(Configuration.GetConnectionString("MvcMovieContext"))); >Имя строки подключения передается в контекст путем вызова метода для объекта DbContextOptions. При локальной разработке система конфигурации ASP.NET Core считывает строку подключения из файла appsettings.json .
Просмотр строки подключения к базе данных
Добавьте строку подключения в файл appsettings.json :
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
< "Logging": < "LogLevel": < "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-1;Trusted_Connection=True;MultipleActiveResultSets=true" >>< "Logging": < "LogLevel": < "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" >>, "AllowedHosts": "*", "ConnectionStrings": < "MvcMovieContext": "Data Source=MvcMovie.db" >>Выполните сборку проекта, чтобы проверить его на ошибки компиляции.
Формирования шаблона страниц фильмов
Используйте средство формирования шаблонов, чтобы создать страницы для операций создания, чтения, обновления и удаления (CRUD) для модели фильма.
- Visual Studio
- Visual Studio Code
- Visual Studio для Mac
В Обозревателе решений щелкните правой кнопкой мыши папку Controllers и выберите Добавить > New Scaffolded Item (Создать шаблонный элемент).

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

Выполните необходимые действия в диалоговом окне Добавление контроллера:
- Класс модели:Movie (MvcMovie.Models)
- Класс контекста данных:MvcMovieContext (MvcMovie.Data)

- Представление: оставьте флажки, установленные по умолчанию.
- Имя контроллера: оставьте имя по умолчанию (MoviesController).
- Выберите Добавить
Visual Studio создаст следующие компоненты:
- контроллер movies ( Controllers/MoviesController.cs );
- файлы представления Razor для страниц Create, Delete, Details, Edit и Index (*Views/Movies/.cshtml).
Автоматическое создание этих файлов называется формированием шаблонов.
- Откройте окно командной строки в каталоге проектов (где находятся файлы Program.cs , Startup.cs и .csproj ).
- В MacOS и Linux экспортируйте путь к средству формирования шаблонов:
export PATH=$HOME/.dotnet/tools:$PATHdotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. -sqlite Флаг, который определяет, DbContext следует ли использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hdotnet aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqliteВ следующей таблице представлены параметры генератора кода ASP.NET Core.
Параметр Описание -m Имя модели. -dc Контекст данных —relativeFolderPath Относительный путь к папке выходных данных для создания файлов —useDefaultLayout|-udl Макет по умолчанию следует использовать для представлений. —referenceScriptLibraries Добавляет _ValidationScriptsPartial для страниц редактирования и создания. -sqlite Флаг, который определяет, DbContext следует ли использовать SQLite вместо SQL Server. Чтобы получить справку по команде aspnet-codegenerator controller , используйте коммутатор h .
dotnet aspnet-codegenerator controller -hСформированные страницы пока использовать нельзя, так как база данных не существует. Если запустить приложение и щелкнуть ссылку «Приложение фильма», вы получите базу данных «Не удается открыть» или нет такой таблицы: сообщение об ошибке «Фильм«.
Первоначальная миграция
EF CoreИспользуйте функцию миграции для создания базы данных. Миграции — это набор средств, позволяющих создавать и обновлять базы данных в соответствии с моделью данных.
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов (PMC).
В PMC введите следующие команды:
Add-Migration InitialCreate Update-Database- Add-Migration InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Так как это первая миграция, созданный класс содержит код для создания схемы базы данных. Схема базы данных создается на основе модели, указанной в классе MvcMovieContext .
- Update-Database : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных. Команда обновления базы данных выдает следующее предупреждающее сообщение:
«Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения».
Дополнительные сведения о средствах PMC смEF CoreEF Core. в справочнике по средствам PMC в Visual Studio.
Если у вас нет dotnet ef , выполните установку в качестве глобального средства:
dotnet tool install --global dotnet-efДополнительные сведения о интерфейсе командной строки EF Coreсм EF Core . в справочнике по средствам для .NET CLI.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, —arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Выполните следующие команды интерфейса командной строки .NET Core:
dotnet ef migrations add InitialCreate dotnet ef database update- ef migrations add InitialCreate : создает Migrations/_InitialCreate.cs файл миграции. Аргумент InitialCreate — это имя миграции. Можно использовать любое имя, но по соглашению выбирается имя, которое описывает миграцию. Так как это первая миграция, созданный класс содержит код для создания схемы базы данных. Схема базы данных основана на модели, указанной MvcMovieContext в классе (в Data/MvcMovieContext.cs файле).
- ef database update : Обновления базу данных до последней миграции, созданной предыдущей командой. Эта команда запускает Up метод в Migrations/_InitialCreate.cs файле, который создает базу данных.
Класс InitialCreate
Изучите Migrations/_InitialCreate.cs файл миграции:
public partial class InitialCreate : Migration < protected override void Up(MigrationBuilder migrationBuilder) < migrationBuilder.CreateTable( name: "Movie", columns: table =>new < false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), Title = table.Column(nullable: true), ReleaseDate = table.Column(nullable: false), Genre = table.Column(nullable: true), Price = table.Column(nullable: false) >, constraints: table => < table.PrimaryKey("PK_Movie", x =>x.Id); >); > protected override void Down(MigrationBuilder migrationBuilder) < migrationBuilder.DropTable( name: "Movie"); >>Метод Up создает таблицу Movie и настраивает Id в качестве первичного ключа. Метод Down отменяет изменения схемы, внесенные миграцией Up .
Тестирование приложения
- Запустите приложение и щелкните ссылку Movie App. Если возникнет исключение наподобие следующего:
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.SqliteException: SQLite Error 1: 'no such table: Movie'.возможно, вы пропустили шаг миграции.
-
Протестируйте страницу создания. Введите и отправьте данные.
Примечание. В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.
Внедрение зависимостей в контроллере
- Visual Studio
- Visual Studio Code/Visual Studio для Mac
Controllers/MoviesController.cs Откройте файл и проверьте конструктор:
public class MoviesController : Controller
Этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных ( MvcMovieContext ) в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
public class MoviesController : Controller
Этот конструктор применяет внедрение зависимостей для внедрения контекста базы данных ( MvcMovieContext ) в контроллер. Контекст базы данных используется в каждом методе создания, чтения, обновления и удаления в контроллере.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В примере кода ниже показано, как внедрить IWebHostEnvironment в среду загрузки. Интерфейс IWebHostEnvironment внедрен, поэтому ConfigureServices может использовать SQLite в среде разработки и SQL Server в рабочей среде.
public class Startup < public Startup(IConfiguration configuration, IWebHostEnvironment env) < Environment = env; Configuration = configuration; >public IConfiguration Configuration < get; >public IWebHostEnvironment Environment < get; >public void ConfigureServices(IServiceCollection services) < services.AddControllersWithViews(); services.AddDbContext(options => < var connectionString = Configuration.GetConnectionString("MvcMovieContext"); if (Environment.IsDevelopment()) < options.UseSqlite(connectionString); >else < options.UseSqlServer(connectionString); >>); > public void Configure(IApplicationBuilder app, IWebHostEnvironment env) < if (env.IsDevelopment()) < app.UseDeveloperExceptionPage(); >else < app.UseExceptionHandler("/Home/Error"); app.UseHsts(); >app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => < endpoints.MapControllerRoute( name: "default", pattern: "//"); >); > >Строго типизированные модели и ключевое слово @model
Ранее в этом руководстве вы ознакомились с передачей данных или объектов из контроллера в представление с использованием словаря ViewData . Словарь ViewData представляет собой динамический объект, который реализует удобный механизм позднего связывания для передачи информации в представление.
Модель MVC также поддерживает передачу строго типизированных объектов модели в представление. Такой подход обеспечивает проверку кода во время компиляции. В этом подходе используется механизм формирования шаблонов (то есть передачи строго типизированной модели) с представлениями и классом MoviesController .
Изучите созданный метод Details в файле Controllers/MoviesController.cs :
// GET: Movies/Details/5 public async Task Details(int? id) < if (id == null) < return NotFound(); >var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id); if (movie == null) < return NotFound(); >return View(movie); >Параметр id обычно передается в качестве данных маршрута. Например, https://localhost:5001/movies/details/1 задает:
- Контроллер movies (первый сегмент URL-адреса).
- Действие details (второй сегмент URL-адреса).
- Идентификатор 1 (последний сегмент URL-адреса).
Также можно передать id с помощью строки запроса следующим образом:
Параметр id определяется как тип, допускающий значение NULL ( int? ), в случае, если не указано значение идентификатора.
Лямбда-выражение передается в FirstOrDefaultAsync для выбора записей фильмов, которые соответствуют данным маршрута или значению строки запроса.
var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id);Если фильм найден, экземпляр модели Movie передается в представление Details :
return View(movie);Изучите содержимое файла Views/Movies/Details.cshtml :
@model MvcMovie.Models.Movie @ < ViewData["Title"] = "Details"; >Details
Movie
- model.Title)
- model.Title)
- model.ReleaseDate)
- model.ReleaseDate)
- model.Genre)
- model.Genre)
- model.Price)
- model.Price)
Edit | Back to ListОператор @model в начале файла представления задает тип объекта, который будет ожидаться представлением. При создании контроллера movie был включен следующий оператор @model :
@model MvcMovie.Models.MovieЭта директива @model обеспечивает доступ к фильму, который контроллер передал в представление. Объект Model является строго типизированным. Например, в представлении Details.cshtml код передает каждое поле фильма во вспомогательные функции HTML DisplayNameFor и DisplayFor со строго типизированным объектом Model . Методы Create и Edit и представления также передают объект модели Movie .
Изучите представление Index.cshtml и метод Index в контроллере Movies. Обратите внимание на то, как в коде создается объект List при вызове метода View . Код передает список Movies из метода действия Index в представление:
// GET: Movies public async Task Index()
Когда контроллер фильмов был создан, шаблон включал следующую @model инструкцию в верхней части Index.cshtml файла:
@model IEnumerable
Эта директива @model обеспечивает доступ к списку фильмов, который контроллер передал в представление с использованием строго типизированного объекта Model . Например, в представлении Index.cshtml код циклически перебирает фильмы с использованием оператора foreach для строго типизированного объекта Model :
@model IEnumerable @ < ViewData["Title"] = "Index"; >Index
Create New
@foreach (var item in Model) <@Html.DisplayNameFor(model => model.Title) @Html.DisplayNameFor(model => model.ReleaseDate) @Html.DisplayNameFor(model => model.Genre) @Html.DisplayNameFor(model => model.Price) >@Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.ReleaseDate) @Html.DisplayFor(modelItem => item.Genre) @Html.DisplayFor(modelItem => item.Price) Edit | Details | Delete Поскольку объект Model является строго типизированным (как и объект IEnumerable ), каждый элемент в цикле получает тип Movie . Помимо прочих преимуществ, это означает, что выполняется проверка кода во время компиляции.
Дополнительные ресурсы
- Entity Framework Core для начинающих
- Вспомогательные функции тегов
- Глобализация и локализация
Как подключить бд к visual studio c
В прошлой теме была создана база данных, теперь подключимся к ней из приложения. В любом проекте WPF, как и в ряде других типов проектов для .NET, по умолчанию есть файл конфигурации, который называется app.config и который имеет следующее содержимое:
Добавим в него строку подключения к бд, изменив файл следующим образом:
Для определения всех подключений в программе в пределах узла добавляется новый узел . В этом узле определяются строки подключения с помощью элемента . Каждая строка подключения имеет название, определяемое с помощью атрибута name . В данном случае строка подключения называется «DefaultConnection». Название может быть произвольное.
Атрибут connectionString собственно хранит строку подключения. Он состоит из трех частей:
- Data Source=.\SQLEXPRESS : указывает на название сервера. По умолчанию для MS SQL Server Express используется «.\SQLEXPRESS»
- Initial Catalog=mobiledb : название базы данных. Так как база данных называется mobiledb, то соответственно здесь данное название и указываем
- Integrated Security=True : задает режим аутентификации
Так как мы будем подключаться к базе данных MS SQL Server, то соответственно мы будем использовать провайдер для SQL Server, функциональность которого заключена в пространстве имен System.Data.SqlClient.
Далее определим код графического интерфейса в xaml:
" Header="Модель" Width="120"/> " Header="Производитель" Width="125"/> " Header="Цена" Width="80"/> Здесь определен довольно простой интерфейс: датагрид для отображения данных, и две кнопки для обновления данных в бд и для удаления. В итоге приложение будет выглядеть следующим образом:

Теперь определим код подключения и все обработчики кнопок в файле кода c#:
using System; using System.Windows; using System.Windows.Controls; using System.Data.SqlClient; using System.Data; using System.Configuration; namespace DbApp < public partial class MainWindow : Window < string connectionString; SqlDataAdapter adapter; DataTable phonesTable; public MainWindow() < InitializeComponent(); // получаем строку подключения из app.config connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; >private void Window_Loaded(object sender, RoutedEventArgs e) < string sql = "SELECT * FROM Phones"; phonesTable = new DataTable(); SqlConnection connection=null; try < connection = new SqlConnection(connectionString); SqlCommand command = new SqlCommand(sql, connection); adapter = new SqlDataAdapter(command); // установка команды на добавление для вызова хранимой процедуры adapter.InsertCommand = new SqlCommand("sp_InsertPhone", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; adapter.InsertCommand.Parameters.Add(new SqlParameter("@title", SqlDbType.NVarChar, 50, "Title")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@company", SqlDbType.NVarChar, 50, "Company")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@price", SqlDbType.Int, 0, "Price")); SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id"); parameter.Direction = ParameterDirection.Output; connection.Open(); adapter.Fill(phonesTable); phonesGrid.ItemsSource = phonesTable.DefaultView; >catch(Exception ex) < MessageBox.Show(ex.Message); >finally < if(connection!=null) connection.Close(); >> private void UpdateDB() < SqlCommandBuilder comandbuilder = new SqlCommandBuilder(adapter); adapter.Update(phonesTable); >private void updateButton_Click(object sender, RoutedEventArgs e) < UpdateDB(); >private void deleteButton_Click(object sender, RoutedEventArgs e) < if (phonesGrid.SelectedItems != null) < for (int i = 0; i < phonesGrid.SelectedItems.Count; i++) < DataRowView datarowView = phonesGrid.SelectedItems[i] as DataRowView; if (datarowView != null) < DataRow dataRow = (DataRow)datarowView.Row; dataRow.Delete(); >> > UpdateDB(); > > >Вся работа с бд производится стандартными средствами ADO.NET и прежде всего классом SqlDataAdapter. Вначале мы получаем в конструкторе строку подключения, которая определена выше в файле app.config:
connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
Чтобы задействовать эту функциональность, нам надо добавить в проект библиотеку System.Configuration.dll .
Далее в обработчике загрузки окна Window_Loaded создаем объект SqlDataAdapter:
adapter = new SqlDataAdapter(command);
В качестве команды для добавления объекта устанавливаем ссылку на хранимую процедуру:
adapter.InsertCommand = new SqlCommand("sp_InsertPhone", connection);Получаем данные из БД и осуществляем привязку:
adapter.Fill(phonesTable); phonesGrid.ItemsSource = phonesTable.DefaultView;
За обновление отвечает метод UpdateDB() :
private void UpdateDB()
Чтобы обновить данные через SqlDataAdapter, нам нужна команда обновления, которую можно получить с помощью объекта SqlCommandBuilder. Для самого обновления вызывается метод adapter.Update() .
Причем не важно, что мы делаем в программе — добавляем, редактируем или удаляем строки. Метод adapter.Update сделает все необходимые действия. Дело в том, что при загрузке данных в объект DataTable система отслеживает состояние загруженных строк. В методе adapter.Update() состояние строк используется для генерации нужных выражений языка SQL, чтобы выполнить обновление базы данных. Более подробно про обновление с помощью адаптеров данных можно почитать здесь: Обновление БД из DataSet вручную
В обработчике кнопки обновления просто вызывается этот метод UpdateDB, а в обработчике кнопки удаления предварительно удаляются все выделенные строки.
Таким образом, мы можем вводить в DataGrid новые данные, редактировать там же уже существующие, сделать множество изменений, и после этого нажать на кнопку обновления, и все эти изменения синхронизируются с базой данных.
Причем важно отметить действие хранимой процедуры — при добавлении нового объекта данные уходят на сервер, и процедура возвращает нам id добавленной записи. Этот id играет большую роль при генерации нужного sql-выражения, если мы захотим эту запись изменить или удалить. И если бы не хранимая процедура, то нам пришлось бы после добавления данных загружать заново всю таблицу в datagrid, только чтобы у новой добавленной записи был в datagrid id. И хранимая процедура избавляет нас от этой работы.
Также здесь мы могли бы выполнять обновление данных сразу после редактирования строки. Для этого нужно задействовать событие RowEditEnding элемента DataGrid:
public MainWindow() < InitializeComponent(); connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; phonesGrid.RowEditEnding += PhonesGrid_RowEditEnding; >private void PhonesGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
И если после окончания редактирования мы нажмем на Enter, то срабатает обработчик события RowEditEnding, который обновит базу данных.
Итак, здесь рассмотрен простейший способ работы с базой данных в WPF. Далее мы рассмотрим еще один способ, который подразумевает применение технологии Entity Framework.
Как подключить бд к visual studio c
Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core
Последнее обновление: 24.10.2018
Чтобы непосредственно начать работать с Entity Framework, создадим первое приложение. Для этого нам нужна будет, во-первых, среда разработки. В качестве среды разработки выберем Visual Studio 2017.
В окне создания проекта в левой части выберем секцию Visual C#->Windows Desktop и в центральной части окна в качестве типа проекта выберем Console App (.NET Framework) .

Теперь первым делом добавим новый класс, который будет описывать данные. Пусть наше приложение будет посвящено работе с пользователями. Поэтому добавим в проект новый класс User:
public class User < public int Id < get; set; >public string Name < get; set; >public int Age < get; set; >>
Это обычный класс, который содержит некоторое количество автосвойств. Каждое свойство будет сопоставляться с отдельным столбцом в таблице из бд.
Надо отметить, что Entity Framework при работе с Code First требует определения ключа элемента для создания первичного ключа в таблице в бд. По умолчанию при генерации бд EF в качестве первичных ключей будет рассматривать свойства с именами Id или [Имя_класса]Id (то есть UserId). Если же мы хотим назвать ключевое свойство иначе, то нам нужно будет внести дополнительную логику на c#.
Теперь для взаимодействия с бд нам нужен контекст данных. Это своего рода посредник между бд и классами, описывающими данные. Но, у нас по умолчанию еще не добавлена библиотека для EF. Чтобы ее добавить, нажмем на проект правой кнопкой мыши и выберем в контекстном меню Manage NuGet Packages.

Затем в появившемся окне управления NuGet-пакетами в окне поиска введем слово «Entity» и выберем пакет собственно Entity Framework и установим его:

После установки пакета добавим в проект новый класс UserContext:
using System; using System.Collections.Generic; using System.Data.Entity; namespace FirstEF6App < class UserContext : DbContext < public UserContext() :base("DbConnection") < >public DbSet Users < get; set; >> >Основу функциональности Entity Framework составляют классы, находящиеся в пространстве имен System.Data.Entity. Среди всего набора классов этого пространства имен следует выделить следующие:
- DbContext : определяет контекст данных, используемый для взаимодействия с базой данных.
- DbModelBuilder : сопоставляет классы на языке C# с сущностями в базе данных.
- DbSet/DbSet : представляет набор сущностей, хранящихся в базе данных
В любом приложении, работающим с БД через Entity Framework, нам нужен будет контекст (класс производный от DbContext) и набор данных DbSet, через который мы сможем взаимодействовать с таблицами из БД. В данном случае таким контекстом является класс UserContext.
В конструкторе этого класса вызывается конструктор базового класса, в который передается строка «DbConnection» — это имя будущей строки подключения к базе данных. В принципе мы можем не использовать конструктор, тогда в этом случае строка подключения носила бы имя самого класса контекста данных.
И также в классе определено одно свойство Users, которое будет хранить набор объектов User. В классе контекста данных набор объектов представляет класс DbSet . Через это свойство будет осуществляться связь с таблицей объектов User в бд.
И теперь нам надо установить подключение к базе данных. Для установки подключения обычно используется файл конфигурации приложения. В проектах для десктопных приложений файл конфигурации называется App.config (как в нашем случае), в проектах веб-приложений — web.config . В нашем случае, поскольку у нас консольное приложение, это файл App.config . После добавления Entity Framework он выглядит примерно следующим образом:
Содержимое файла в каждом конкретном случае может отличаться. Но в любом случае после добавления EntityFramework в проект в нем будет содержаться элемент configSections. И после закрывающего тега добавим следующий элемент:
Все подключения к источникам данных устанавливаются в секции connectionStrings , а каждое отдельное подключение представляет элемент add . В конструкторе класса контекста UserContext мы передаем в качестве названия подключения строку «DbConnection», поэтому данное название указывается в атрибуте name=»DBConnection» .
Настройку строки подключения задает атрибут connectionString . В данном случае мы устанавливаем название базы данных, с которой будем взаимодействовать — userstore.
Теперь перейдем к файлу Program.cs и изменим его содержание следующим образом:
using System; namespace FirstEF6App < class Program < static void Main(string[] args) < using(UserContext db = new UserContext()) < // создаем два объекта User User user1 = new User < Name = "Tom", Age = 33 >; User user2 = new User < Name = "Sam", Age = 26 >; // добавляем их в бд db.Users.Add(user1); db.Users.Add(user2); db.SaveChanges(); Console.WriteLine("Объекты успешно сохранены"); // получаем объекты из бд и выводим на консоль var users = db.Users; Console.WriteLine("Список объектов:"); foreach(User u in users) < Console.WriteLine(". - ", u.Id, u.Name, u.Age); > > Console.Read(); > > >Так как класс UserContext через родительский класс DbContext реализует интерфейс IDisposable , то для работы с UserContext с автоматическим закрытием данного объекта мы можем использовать конструкцию using .
В конструкции using создаются два объекта User и добавляются в базу данных. Для их сохранения нам достаточно использовать метод Add : db.Users.Add(user1)
Чтобы получить список данных из бд, достаточно воспользоваться свойством Users контекста данных: db.Users
В результате после запуска программа выведет на консоль:
Объекты успешно сохранены Список объектов: 1.Tom - 33 2.Sam - 26
Таким образом, Entity Framework обеспечивает простое и удобное управление объектами из базы данных. При том в данном случае нам не надо даже создавать базу данных и определять в ней таблицы. Entity Framework все сделает за нас на основе определения класса контекста данных и классов моделей. И если база данных уже имеется, то EF не будет повторно создавать ее.
Наша задача — только определить модель, которая будет храниться в базе данных, и класс контекста. Поэтому данный подход называется Code First — сначала пишется код, а потом по нему создается база данных и ее таблицы.
Возникает вопрос, а где же находится БД? Чтобы физически увидеть базу данных, мы можем подключиться к ней из Visual Studio через окно View->SQL Server Object Explorer . После этого мы можем увидеть в SQL Server Object Explorer созданную базу данных, посмотреть ее строение, таблицы, открыть и даже изменить данные в таблицах:

Физически база данных по умолчанию будет располагаться в папке пользователя, в частности, у меня она размещена в каталоге C:\Users\Eugene\ , только к ее названию буде добавляться стандартное расширение mdf — userstore.mdf.
