Литмир - Электронная Библиотека
A
A

Сброс состояния DbContext

В версии EF Core 5 появилась возможность сброса состояния

DbContext
. Метод
ChangeTracker.Clear()
отсоединяет все сущности от свойств
DbSet<T>
, устанавливая их состояние в
Detached
.

Сущности

Строго типизированные классы, которые сопоставляются с таблицами базы данных, официально именуются сущностями. Коллекция сущностей в приложении образует концептуальную модель физической базы данных. Выражаясь формально, такая модель называется моделью сущностных данных (entity data model — EDM) или просто моделью. Модель сопоставляется с предметной областью приложения. Сущности и их свойства отображаются на таблицы и столбцы с применением соглашений EntityFramework Core, конфигурации и Fluent API (кода). Сущности не обязаны быть сопоставленными напрямую со схемой базы данных. Вы можете структурировать сущностные классы согласно потребностям создаваемого приложения и затем отобразить свои уникальные сущности на схему базы данных.

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

Inventory
из базы данных
AutoLot
и сущностный класс
Car
из предыдущей главы. Имена отличаются, но сущность
Car
сопоставляется с таблицей
Inventory
. Исполняющая среда EF Core исследует конфигурацию сущностей в модели, чтобы отобразить клиентское представление таблицы
Inventory
(класс
Car
в примере) на корректные столбцы таблицы
Inventory
.

В последующих разделах будет показано, каким образом соглашения EF Core, аннотации данных и код (использующий Fluent API) сопоставляют сущности, свойства и отношения между сущностями в модели с таблицами, столбцами и отношениями внешних ключей в базе данных.

Сопоставление свойств со столбцами

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

Наличие поддерживающих полей предпочтительнее в двух сценариях: при использовании шаблона

INotifyPropertyChanged
в приложениях Windows Presentation Foundation (WPF) и при возникновении конфликта между стандартными значениями базы данных и стандартными значениями .NET Core. Применение EF Core с WPF обсуждается в главе 28, а стандартные значения базы данных раскрываются позже в текущей главе.

Имена, типы данных и допустимость значений

null
столбцов конфигурируются через соглашения, аннотации данных и/или Fluent API. Все указанные темы подробно рассматриваются далее в главе.

Сопоставление классов с таблицами

В EF Core доступны две схемы сопоставления классов с таблицами: "таблица на иерархию" (table-per-hierarchy — ТРН) и "таблица на тип" (table-per-type — ТРТ). Сопоставление ТРН используется по умолчанию и отображает иерархию наследования на единственную таблицу. Появившееся в версии EF Core 5 сопоставление ТРТ отображает каждый класс в иерархии на собственную таблицу.

На заметку! Классы также можно отображать на представления и низкоуровневые запросы SQL. Они называются типами запросов и обсуждаются позже в главе.

Сопоставление "таблица на иерархию" (ТРН)

Рассмотрим приведенный ниже пример, в котором класс

Car
из главы 21 разделен на два класса: базовый класс для свойств
Id
и
TimeStamp
и собственно класс
Car
с остальными свойствами. Оба класса должны быть созданы в папке
Models
проекта
AutoLot.Samples
:

using System.Collections.Generic;

namespace AutoLot.Samples.Models

{

  public abstract class BaseEntity

  {

    public int Id { get; set; }

    public byte[] TimeStamp { get; set; }

  }

}

using System.Collections.Generic;

namespace AutoLot.Samples.Models

{

  public class Car : BaseEntity

  {

    public string Color { get; set; }

    public string PetName { get; set; }

    public int MakeId { get; set; }

  }

}

Чтобы уведомить EF Core о том, что сущностный класс является частью объектной модели, предусмотрите свойство

DbSet<T>
для сущности. Добавьте в класс
ApplicationDbContext
такой оператор
using
:

using AutoLot.Samples.Models;

Поместите следующий код в класс

ApplicationDbContext
между конструктором и методом
OnModelCreating()
:

public DbSet<Car> Cars { get; set; }

Обратите внимание, что базовый класс не добавляется в виде экземпляра

DbSet<T>
. Хотя подробные сведения о миграциях приводятся позже в главе, давайте создадим базу данных и таблицу
Cars
. Откройте окно командной строки в папке проекта
AutoLot.Samples
и выполните показанные ниже команды:

dotnet tool install --global dotnet-ef --version 5.0.1

411
{"b":"847442","o":1}