Entity framework создание таблиц
В этом руководстве мы будем использовать Visual Studio 2022 и SQL Server 2014.
Создание таблицы
Для выполнения CRUD операций мы будем использовать таблицу “userdetails”. Откройте SQL Server и создайте таблицу “userdetails”, используя запрос, приведенный ниже.
Добавление уровня доступа к данным в приложение
А теперь мы создадим класс “DatabaseContext.cs”, в котором определим подключение к базе данных. Для этого кликните правой кнопкой мыши проект “BlazorApp.Server” и добавьте папку “Models”. Добавьте файл “DatabaseContext.cs” в папку “Models” и перенесите в него приведенный ниже код:
Далее, необходимо будет создать еще две папки “Interfaces” и “Services” для обработки операций, связанных с базой данных.
Для этого кликните правой кнопкой мыши проект “BlazorApp.Server” и добавьте две новые папки “Interfaces” и “Services”.
Добавьте интерфейс в папку “Interfaces”, назовите его “IUser.cs” и перенесите в него приведенный ниже код:
Добавьте класс “UserManager.cs” в папку “Services”, который реализует интерфейс “IUser”, и перенесите в него приведенный ниже код:
Теперь необходимо добавить ссылки на “DatabaseContext”, “IUser” и “UserManager” в файл Program.cs проекта “BlazorApp.Server”.
Откройте файл “Program.cs” и перенесите в него приведенный ниже код:
Создание таблицы
Для выполнения CRUD операций мы будем использовать таблицу “userdetails”. Откройте SQL Server и создайте таблицу “userdetails”, используя запрос, приведенный ниже.
Добавление веб-API контроллера в приложение
Откройте файл “UserController.cs” и перенесите в него приведенный ниже код:
Добавление модели в приложение
Теперь мы создадим класс Model, который будет содержать свойства модели User.
Для этого кликните правой кнопкой мыши на проект “BlazorApp.Shared” и добавьте новую папку с названием “Models”.
Затем кликните правой кнопкой мыши на папку “Models” и добавьте класс “User.cs”.
Откройте файл “User.cs” и вставьте в него код, приведенный ниже:
Подключение и создание базы данных в Entity Framework Core
Для взаимодействия с MS SQL Server через Entity Framework необходим пакет Microsoft.EntityFrameworkCore.SqlServer . По умолчанию он отсутствует в проекте, поэтому его надо добавить, например, через пакетный менеджер Nuget:
Далее добавим в проект класс модели, с которой мы будем работать. По умолчанию в проекте уже есть предназначенная для моделей папка Models. Определим в этой папке определим новый класс User:
Эта модель представляет те объекты, которые будут храниться в базе данных.
Чтобы взаимодействовать с базой данных через Entity Framework нам нужен контекст данных - класс, унаследованный от класса Microsoft.EntityFrameworkCore.DbContext . Поэтому добавим в папку Models новый класс, который назовем ApplicationContext (название класса контекста произвольное):
Свойство DbSet представляет собой коллекцию объектов, которая сопоставляется с определенной таблицей в базе данных. При этом по умолчанию название свойства должно соответствовать множественному числу названию модели в соответствии с правилами английского языка. То есть User - название класса модели представляет единственное число, а Users - множественное число.
Через параметр options в конструктор контекста данных будут передаваться настройки контекста.
В конструкторе с помощью вызова Database.EnsureCreated() по определению моделей будет создаваться база данных (если она отсутствует).
Чтобы подключаться к базе данных, нам надо задать параметры подключения. Для этого изменим файл appsettings.json , добавив в него определение строки подключения:
В данном случае мы будем использовать упрощенный движок базы данных LocalDB, который представляет легковесную версию SQL Server Express, предназначенную специально для разработки приложений.
И последним шагом в настройке проекта является изменение файла Startup.cs . В нем нам надо изменить метод ConfigureServices() :
Добавление контекста данных в виде сервиса позволит затем получать его в конструкторе контроллера через механизм внедрения зависимостей.
Создание веб-приложения Blazor
Шаг 1
Шаг 2
На этом шаге выбираем тип проекта “Blazor WebAssembly App”.
Шаг 3
Шаг 4
Таким образом будет создано приложение Blazor, и структура папок в Solution Explorer будет выглядеть, как показано на изображении ниже.
На изображении мы также видим 3 файла проекта, которые созданы внутри солюшена “BlazorApp”.
BlazorApp.Client — содержит клиентский код и страницы, которые будут отображаться в браузере.
BlazorApp.Server — содержит серверный код, такой как подключение к базе данных, операции и веб-API.
BlazorApp.Shared — содержит общий код, к которому есть доступ как у клиента, так и у сервера.
Если запустить приложение на данном этапе, нажав F5, мы увидим главную страницу приложения, похожую на изображенную ниже.
Установка необходимых Nuget-пакетов
Перейдите в пункт меню “Tools”, выберите NuGet Package Manager > Package Manager Console
а затем выполните приведенные ниже команды, чтобы добавить поставщика базы данных и инструменты Entity Framework.
Добавление Razor View в приложение
Добавим три страницы в проект “BlazorApp.Client”. Для просмотра записей пользователей добавляем страницу “UserDetails.razor”, страницу “AddUser.razor” для добавления и редактирования сведений о пользователе и страницу “DeleteUser.razor” для удаления пользователя.
Кликните правой кнопкой мыши по папке “Pages” проекта “BlazorApp.Client” и выберите “Add”, затем “New Item”. Откроется диалоговое окно “Add New Item”. Выберите “Web” на левой панели, затем выберите “Razor Component” из шаблонов и введите имя “UserDetails.razor”. По этому же принципу добавляем еще две страницы “AddUser.razor” и “DeleteUser.razor” в проект “BlazorApp.Client”.
Откройте файл “UserDetails.razor” и перенесите в него приведенный ниже код:
Откройте страницу “AddUser.razor” и перенесите приведенный ниже код, где мы можем добавить нового пользователя, а также изменить о нем сведения.
Откройте страницу “DeleteUser.razor” и вставьте приведенный ниже код.
Добавьте ссылку “User Details” в меню навигации. Для этого откройте файл “BlazorApp.Client/Shared/ NavMenu.razor” и перенесите в него приведенный ниже код:
Давайте запустим приложение. После запуска приложения, мы увидим навигационную ссылку “User Details” под ссылкой “Fetch Data” с левой стороны, как показано на изображении ниже.
Когда мы кликаем “User Details” в меню навигации, оно перенаправляет нас на страницу “User Details” и отображает все данные пользователя.
На странице “User Details” мы можем найти кнопку “Add User”. Нажав ее, мы будем перенаправлены на страницу “Add User”, где мы можем добавить нового пользователя.
Если мы хотим отредактировать или удалить существующую запись пользователя, нажмите ссылку “Edit” или “Delete” этой текущей записи. Откроется соответствующее представление (редактирование/удаление), как показано ниже, где мы можем редактировать или удалять пользовательские данные.
-
или Visual Web Developer Express 2010 SP1 (если вы используете для установки одну из этих ссылок, следующий софт установится автоматически)
The Contoso University
Приложение, которые вы разработаете, является простым вебсайтом университета.
Пользователи смогут просматривать и обновлять данные о студентах, курсах и преподавателях. Несколько скриншотов того, что получится, ниже.
UI близок по стилю к тому, что генерируется шаблонами по умолчанию, поэтому акцент будет на вопросах использования Entity Framework.
Подходы к разработке с Entity Framework
Исхоя из диаграммы, имеется три подхода к работе с данными в Entity Framework: Database First, Model First, и Code First.
Database First
В случае уже имеющейся базы данных Entity Framework может автоматически создать модель данных, состоящую из классов и свойств, соответствующих объектам базы даных (таким, как таблицы и столбцы). Информация о структуре базы (store schema), модель данных (conceptual model) и маппинг их друг на друга содержится в XML в файле .edmx. Visual Studio предоставляет графический дизайнер Entity Framework, с помощью которого можно просматривать и редактировать .edmx. Части Getting Started With the Entity Framework и Continuing With the Entity Framework в материалах о Web Forms используют подход Database First.
Model First
Если базы нет, вы можете начать с создания модели данных, используя дизайнер Entity Framework Visual Studio. После окончания работ над моделью дизайнер сгенерирует DDL (data definition language)-код для создания базы. В этом подходе для хранения информации о модели и маппингах также используется .edmx. What's New in the Entity Framework 4 включает небольшой пример разработки с использованием данного подхода.
Code First
Вне зависимости от наличия базы вы можете вручную написать код классов и свойств, соответствующих сущностям в базе и использовать этот код с Entity Framework без использования файла .edmx. Именно поэтому можно порой увидеть, как этот подход называют code only, хотя официальное наименование Code First. Маппинг между store schema и conceptual model в represented by your code is handled by convention and by a special mapping API. Если базы ещё нет, Entity Framework может создать, удалить или пересоздать её в случае изменений в модели.
API доступа к данным, разработанное для Code First, основано на классе DbContext . API может быть использован также и в процессе разработки с подходами Database First и Model First. Для дополнительной информации смотрите When is Code First not code first? В блоге команды разработки Entity Framework.
POCO (Plain Old CLR Objects)
По умолчанию для подходов Database First и Model First классы модели данных наследуются от EntityObject, который и предоставляет функциональность Entity Framework. Это значит, что эти классы не являются persistence ignorant и, таким образом, не полностью соответствуют одном из условий domain-driven design. Все подходы к разработке с Entity Framework также могут работать с POCO (plain old CLR objects), что, в целом, значит, что они являются persistence-ignorant из-за отсутствия наследования EntityObject .
Создание веб-приложения MVC
Настройка стилей
Несколько небольших поправок изменят меню сайта, расположение элементов и домашнюю страницу.
Для настройки меню Contoso University, в Views\Shared\_Layout.cshtml замените текст в h 1 и ссылки в меню, как в примере:
В Views\Home\Index.cshtml удалите всё в теге h2 .
В Controllers\HomeController.cs замените "Welcome to ASP.NET MVC!" на "Welcome to Contoso University!"
В Content\Site.css для смещения меню влево совершите следующие изменения:
Создание модели данных
Далее создадим первые классы-сущности для Contoso University. Мы начнём со следующих трёх сущностей:
Установлена связь один-ко-многим между сущностями Student и Enrollment , и связь один-ко-многим между Course и Enrollment . Другими словами, студент может посещать любое количество курсов, и курс может иметь любое количество студентов, посещающих его.
В дальнейшем вы создадите классы для каждой из этих сущностей.
Note: компиляция проекта без созданных классов для этих сущностей вызовет ошибки компиляторов.
Сущность Student
В папке Models создайте Student.cs и замените сгенерированный код на:
Свойство StudentID будет первичным ключом соответствующей таблицы. По умолчанию, Entity Framework воспринимает свойство с ID или classname ID как первичный ключ.
Свойство Enrollments — navigation property. Navigation properties содержат другие сущности, относящиеся к текущей. В данном случае свойство Enrollments содержит в себе все сущности Enrollment , ассоциированные с текущей сущностью Student . Другими словами, если некая запись Student в базе данных имеет связь с двумя записями Enrollment (записей, содержащих значения первичных ключей для студента в поле внешнего ключа StudentID ), свойство этой записи Enrollments будет содержать две сущности Enrollment .
Navigation properties обычно помечаются модификатором virtual дабы использовать возможность Entity Framework, называемую lazy loading. (суть Lazy loading будет объяснена позже, в Reading Related Data) Если navigation property может содержать несколько сущностей (в связях многие-ко-многим и один-ко-многим), его тип должен быть ICollection .
Сущность Enrollment
В папке Models создайте Enrollment.cs со следующим содержанием:
Знак вопроса после указания типа decimal указывает на то, что свойство Grade nullable. Оценка, поставленная в null отличная от нулевой оценки— null обозначает то, что оценка еще не выставлена, тогда как 0 – уже значение.
Свойство StudentID является внешним ключом, и соответствующее navigation property Student . Сущность Enrollment ассоциирована с одной сущностью Student , поэтому свойство может содержать только одну сущность указанного типа (в отличие Student . Enrollments ).
Свойство CourseID является внешним ключом, и соответствующее navigation property Course . Сущность Enrollment ассоциирована с одной сущностью Course .
Сущность Course
В папке Models создайтеCourse.cs со следующим содержанием:
Свойство Enrollments — navigation property. Сущность Course может ассоциироваться с бесконечным множеством сущностей Enrollment .
Создание Database Context
Главный класс, координирующий функциональность Entity Framework для текущей модели данных называется database context. Данный класс наследуется от System . Data . Entity . DbContext . В коде вы определяете, какие сущности включить в модель данных, и также можете определять поведение самого Entity Framework. В нашем коде этот класс имеет название SchoolContext .
Создайте папку DAL и в ней новый класс SchoolContext.cs:
Код создаёт свойство DbSet для каждого множества сущностей. В терминологии Entity Framework множество сущностей (entity set) относится к таблице базы данных, и сущность относится к записи в таблице.
Содержимое метода OnModelCreating защищает имена таблиц от плюрализации, и, если вы этого не делаете, то получаете такие имена таблиц, как Students , Courses , Enrollments . В ином случае имена таблиц будут Student , Course , Enrollment . Разработчики спорят на тему того, нужно ли плюрализовывать имена таблиц или нет. Мы используем одиночную форму, но важен тот момент, что вы можете выбрать, включать эту строчку в код или нет.
(Этот класс находится в namespace Models потому, что в некоторых ситуациях подход Code First подразумевает нахождение классов сущностей и контекста в одном и том же namespace.)
Определение Connection String
Вам не нужно определять connection string. Если вы не определили эту строку, Entity Framework автоматически создаст базу данных SQL Server Express. Мы, однако, будем работать с SQL Server Compact, и вам необходимо будет создать строку подключения с указанием на это.
Откройте Web.config и добавьте новую строку подключения в коллекцию connectionStrings . (Убедитесь, что вы обновляете Web.config в корне проекта, так как есть еще один Web.config в папке Views, который трогать не надо.)
По умолчанию Entity Framework ищет строку подключения, названную также как object context class. Строка подключения, которую вы добавили, определяет базу данных School.sdf, находящуюся в папке App_data и SQL Server Compact.
Инициализация базы данных с тестовыми данными
Entity Framework может автоматически создать базу данных при запуске приложения. Вы можете указать, что это должно выплоняться при каждом запуске приложения или только тогда, когда модель рассинхронизирована с существующей базой. Вы можете также написать класс с методом, который Entity Framework будет автоматически вызывать перед созданием базы для использования её с тестовыми данными. Мы укажем, что база должна удаляться и пересоздаваться при изменении модели.
В папке DAL создайте новый класс SchoolInitializer.cs с кодом, с помощью которого база будет создана при необходимости и заполнена тестовыми данными.
Метод Seed принимает объект контекста базы как входящий параметр и использует его для добавления новых сущностей в базу. Для каждого типа сущности код создает коллекцию новых сущностей, добавляя их в соответствующее свойство DbSet, и потом сохраняет изменения в базу. Нет необходимости в вызове SaveChanges после каждой группы сущностей, как сделано у нас, но это помогает определить проблему в случае возникновения исключений.
Измените Global.asax.cs для того, чтобы наш код вызывался при каждом запуске приложения:
- Добавьте using :
- В методе Application_Start вызовите метод Entity Framework, который запускает код инициализации базы:
Note при развертывании приложения на продакшн-сервер вы должны удалить весь код, который инициализирует базу тестовыми данными.
Далее вы создадите веб-страницу для отображения данных, и процесс запроса данных автоматически инициирует создание базы. Вы начнете с нового контроллера, но перед этим, соберите проект для того, чтобы модель и контекстные классы стали доступны для MVC controller scaffolding.
Создание контроллера Student
Для создание контроллера Student , щелкните на папке Controllers в Solution Explorer, нажмите Add, Controller. В Add Controller совершите следующие действия и изменения и нажмите Add:
- Controller name: StudentController.
- Template: Controller with read/write actions and views, using Entity Framework. (по умолчанию.)
- Model class: Student (ContosoUniversity.Models). (если этого нет, пересоберите проект)
- Data context class: SchoolContext (ContosoUniversity.Models).
- Views: Razor (CSHTML). (по умолчанию)
Откройте Controllers\StudentController.cs, вы увидите созданную переменную, инициализирующую объект контекста базы данных:
Действие Index собирает список студентов из свойства Students из экземпляра контекста базы данных:
Автоматическое scaffolding было создано для множества Student . Для настройки заголовков и последовательности колонок откройте Views\Student\Index.cshtml и замените код на:
Запустите сайт, нажмите на вкладку Students.
Закройте браузер. В Solution Explorer выберите проект ContosoUniversity. Нажмите Show all Files, Refresh и затем разверните папку App_Data.
Два раза щелкните на School.sdf для открытия Server Explorer, и Tables.
Note если у вас возникает ошибка после того, как вы два раза щелкаете на School.sdf, убедитесь, что вы установили Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0. Если все установлено, перезапустите Visual Studio.
Для каждой таблицы есть свое множество сущностей + одна дополнительная таблица. EdmMetadata используется для определения Entity Framework, когда случилась разсинхронизация модели и базы.
Щелкните на одной из таблиц и Show Table Data чтобы увидеть загруженные классом SchoolInitializer данные.
Закройте подключение, иначе может возникнуть проблема с запуском приложения.
Соглашения
Количество кода, нужное для создания Entity Framework базы, минимально из-за использования (conventions) Entity Framework. Некоторые из них уже были упомянуты:
- Форма множественного числа имен классов сущностей используется в качестве имен таблиц.
- Имена свойств сущностей используется в качестве имен столбцов.
- Свойства сущностей с именами ID или classname ID распознаются как первичные ключи.
- Entity Framework подключается к базе, отыскав строку подключения с таким же именем, как и класс контекста (в данном случае SchoolContext ).
Вы создали простое приложение с использованием Entity Framework и SQL Server Compact для хранения и отображения данных. Далее мы научимся совершать простые CRUD (create, read, update, delete) операции.
В Models\Course.cs замените ранее созданный код на:
Атрибут DatabaseGenerated
Атрибут DatabaseGenerated с параметром None, указанный для свойства CourseID, определяет то, что значение первичного ключа задаётся пользователем, а не генерируется базой данных.
По умолчанию Entity Framework предполагает автогенерацию первичных ключей базой данных, что и необходимо в большинстве ситуаций. Однако для сущности Course используются численные заданные пользователем значения, такие как 1000 для одного факультета, 2000 для другого и так далее.
Внешний ключ и Navigation Properties
Свойства-внешние ключи и navigation properties в сущности Course отражают следующие связи:
Курс ассоциирован с одним факультетом, таким образом, имеется внешний ключ DepartmentID и Department navigation property:
public int DepartmentID < get; set; >
public virtual Department Department
Курс может посещать неограниченное количество студентов, поэтому имеется Enrollments navigation property:
public virtual ICollection Enrollments
Курс может вестись различными преподавателями, поэтому имеется Instructors navigation property:
public virtual ICollection Instructors
Создание сущности Department
Создайте Models\Department.cs со следующим кодом:
Атрибут Column
Ранее атрибут Column мы использовали для изменения маппинга имени столбца. В коде для сущности Department этот атрибут используется для изменения маппинга типа данных SQL, то есть столбец будет определён в базе данных с типом данных SQL Server:
Обычно это не нужно, потому что Entity Framework автоматически подбирает наиболее подходящий тип данных исходя из типа CLR, который определён для свойства. Допустим, CLR тип decimal станет SQL Server типом decimal. Но в данном случае вы точно знаете, что свойство будет содержать цифры, связанные с валютой, и тип money будет наиболее подходящим для этого свойства.
Внешний ключ и Navigation Properties
Внешними ключами и navigation properties отражены следующие связи:
Факультет может как содержать, так и не содержать администратора, и администратор всегда = преподаватель. Поэтому свойство InstructorID определено как внешний ключ для сущности Instructor, и знак вопроса после типа int указывает на то, что свойство может быть nullable. Navigation property Administrator содержит сущность Instructor:
public int? InstructorID
public virtual Instructor Administrator < get; set; >
Факультет может иметь множество курсов, поэтому присутствует Courses navigation property:
public virtual ICollection Courses
Note Конвенциями определено, что Entity Framework каскадно удаляет non-nullable внешние ключи и в случаях связи многие-ко-многим. Это может привести к итеративному каскадному удалению, вызвав исключение при запуске кода. Допустим, если не определить Department.InstructorID как nullable, вы получите следующее исключение при: "The referential relationship will result in a cyclical reference that's not allowed."
Изменения, связанные с сущностью Student
В Models\Student.cs замените код на:
Изменения, касающиеся сущности Enrollment
В Models\Enrollment.cs замените код на:
Внешние ключи и Navigation Properties
Внешние ключи и navigation properties отражают следующие связи:
Каждой сущности записи на курс соответствует один курс, поэтому присутствует внешний ключ CourseID и Course navigation property:
public int CourseID
public virtual Course Course < get; set; >
Каждой сущности записи на курс соответствует один студент, поэтому присутствует внешний ключ StudentID и Student navigation property:
public int StudentID
public virtual Student Student
Связи многие-ко-многим
Сущности Student и Course связаны друг с другом связью многие-ко-многим, и сущность Enrollment соответствует and the Enrollment entity corresponds to a many-to-many join table with payload in the database. Это значит, что таблица Enrollment содержит дополнительные данные помимо внешних ключей для объединённых таблиц (в нашем случае первичный ключ и свойство Grade).
На изображении ниже представлены связи в виде диаграммы сущностей, сгенерированной Entity Framework designer.
Линия каждой связи имеет 1 на одном конце и * на другом, обозначая связь один-ко-многим.
Если таблица Enrollment не содержит информацию об оценках, необходимо иметь только два внешних ключа CourseID и StudentID. In that case, it would correspond to a many-to-many join table without payload (or a pure join table) in the database, and you wouldn't have to create a model class for it at all. Сущности Instructor и Course связаны подобной связью многие-ко-многим, и, как вы видите, между ними нет класса сущности:
Хотя объединённая таблица необходима:
Entity Framework автоматически создаёт таблицу CourseInstructor, доступ к которой осуществляется косвенно, а именно через Instructor.Courses и Course.Instructors navigation properties.
Атрибут DisplayFormat
Атрибут DisplayFormat для свойства Grade определяет форматирование для элемента:
- Оценка выводится в формате "3.5" или "4.0".
- Такое же форматирование оценка имеет и в режиме.
- Если оценки нет, выводится надпись "No grade".
Связи на диаграмме сущностей
Диаграмма ниже демонстрирует систему связей для модели School.
Кроме связей многие-ко-многим (*-*) и один-ко-многим (1-*), можно также увидеть связь один-к-нулю-или-одному (1-0..1) между сущностями Instructor и OfficeAssignment и нуль-к-одному-или-ко-многим (0..1 — *) Department и Instructor.
Настройка контекста базы данных
Дальше мы добавим новые сущности в класс SchoolContext и настроим мапинг. В некоторых случаях необходимо будет использовать методы вместо атрибутов из-за того, что для некоторой функциональности атрибутов просто не сущнствует. В других случаях можно выбирать, использовать методы или атрибуты (некоторые люди предпочитают не использовать атрибуты).
Замените код в DAL\SchoolContext.cs на:
В методе OnModelCreating определяются следующие связи:
Один-к-нулю-или-одному между Instructor и OfficeAssignment:
modelBuilder.Entity().HasOptional(p => p.OfficeAssignment).WithRequired(p => p.Instructor);
Многие-ко-многим между Instructor и Course. Код определяет таблицу и столбцы для объединённой таблицы. Code First может настроить связь многие-ко-многим и без кода, но если вы его не вызовете, то для столбцов будут взяты стандартные имена, такие как InstructorInstructorID для InstructorID.
modelBuilder.Entity()
.HasMany(c => c.Instructors).WithMany(i => i.Courses)
.Map(t => t.MapLeftKey("CourseID")
.MapRightKey("InstructorID")
.ToTable("CourseInstructor"));
Один-к-нулю-или-одному между Department и Instructor, с помощью Department.Administrator navigation property:
Заполнение базы данных тестовыми данными
Перед этим вы создавали DAL\SchoolInitializer.cs для заполнения базы тестовыми данными. Теперь замените старый код на новый, который учитывает присутствие новых сущностей.
Обратите внимание на обработку сущности Course, которая связана связью многие-ко-многим с сущностью Instructor:
При создании объекта Course как пустая коллекция (Instructors = new List()), что делает возможным добавление сущностей Instructor, связанных с Course, с помощью метода Instructor.Add(). Если вы не создали пустой List, у вас не получится добавлять подобные отношения, потому что свойство Instructors будет равно null и не будет иметь метода Add.
Note Не забывайте перед развертыванием проекта на production-сервер удалять весь код инициализации базы.
Удаление и пересоздание базы данных
Запустите проект и выберите страницу Student Index.
Если страница не открывается или вы получаете ошибку о том, что файл School.sdf уже используется (изображение ниже), необходимо еще раз открыть Server Explorer и закрыть подключение к базе и затем попробовать снова открыть страницу.
После этого откройте базу в Server Explorer и посмотрите в Tables новые таблицы.
Кроме EdmMetadata обратите внимание на таблицу, для которой вы не создавали класса CourseInstructor. Это объединённая из Instructor и Course таблица.
Щелкните на таблице CourseInstructor и нажмите Show Table Data чтобы убедиться в наличии данных, добавленных ранее Course.Instructors navigation property.
Теперь у вас есть сложная модель данных и соответствующая база данных. Дальше мы научимся разным способам обращения к данным.
Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core
Чтобы непосредственно начать работать с Entity Framework, создадим первое приложение. Для этого нам нужна будет, во-первых, среда разработки. В качестве среды разработки выберем Visual Studio 2017.
Теперь первым делом добавим новый класс, который будет описывать данные. Пусть наше приложение будет посвящено работе с пользователями. Поэтому добавим в проект новый класс User:
Это обычный класс, который содержит некоторое количество автосвойств. Каждое свойство будет сопоставляться с отдельным столбцом в таблице из бд.
Теперь для взаимодействия с бд нам нужен контекст данных. Это своего рода посредник между бд и классами, описывающими данные. Но, у нас по умолчанию еще не добавлена библиотека для EF. Чтобы ее добавить, нажмем на проект правой кнопкой мыши и выберем в контекстном меню Manage NuGet Packages.
Затем в появившемся окне управления NuGet-пакетами в окне поиска введем слово "Entity" и выберем пакет собственно Entity Framework и установим его:
После установки пакета добавим в проект новый класс UserContext:
Основу функциональности Entity Framework составляют классы, находящиеся в пространстве имен System.Data.Entity. Среди всего набора классов этого пространства имен следует выделить следующие:
DbContext : определяет контекст данных, используемый для взаимодействия с базой данных.
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 и изменим его содержание следующим образом:
Так как класс UserContext через родительский класс DbContext реализует интерфейс IDisposable , то для работы с UserContext с автоматическим закрытием данного объекта мы можем использовать конструкцию using .
В результате после запуска программа выведет на консоль:
Таким образом, Entity Framework обеспечивает простое и удобное управление объектами из базы данных. При том в данном случае нам не надо даже создавать базу данных и определять в ней таблицы. Entity Framework все сделает за нас на основе определения класса контекста данных и классов моделей. И если база данных уже имеется, то EF не будет повторно создавать ее.
Наша задача - только определить модель, которая будет храниться в базе данных, и класс контекста. Поэтому данный подход называется Code First - сначала пишется код, а потом по нему создается база данных и ее таблицы.
Возникает вопрос, а где же находится БД? Чтобы физически увидеть базу данных, мы можем подключиться к ней из Visual Studio через окно View->SQL Server Object Explorer . После этого мы можем увидеть в SQL Server Object Explorer созданную базу данных, посмотреть ее строение, таблицы, открыть и даже изменить данные в таблицах:
Физически база данных по умолчанию будет располагаться в папке пользователя, в частности, у меня она размещена в каталоге C:\Users\Eugene\ , только к ее названию буде добавляться стандартное расширение mdf - userstore.mdf.
Читайте также: