Наследование в entity framework


Таблица на иерархию и дискриминаторная конфигурация


Download 39.18 Kb.
bet2/5
Sana28.10.2023
Hajmi39.18 Kb.
#1730049
1   2   3   4   5
Bog'liq
NASLEDOVANIYE ...

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

Можно настроить имя и тип столбца дискриминатора, а также значения, используемые для идентификации каждого типа в иерархии:
C#Копировать
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasDiscriminator("blog_type")
.HasValue("blog_base")
.HasValue("blog_rss");
}
В приведенных выше примерах EF неявно добавил дискриминатор в качестве теневого свойства для базовой сущности иерархии. Это свойство можно настроить так же, как и любое другое:
C#Копировать
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property("Discriminator")
.HasMaxLength(200);
}
Наконец, дискриминатор также можно сопоставить с обычным свойством .NET в вашей сущности:
C#Копировать
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasDiscriminator(b => b.BlogType);


modelBuilder.Entity()
.Property(e => e.BlogType)
.HasMaxLength(200)
.HasColumnName("blog_type");

modelBuilder.Entity();
}
При запросе производных сущностей, использующих шаблон TPH, EF Core добавляет предикат над дискриминаторным столбцом в запросе. Этот фильтр гарантирует, что мы не получим никаких дополнительных строк для базовых типов или одноуровневых типов, отсутствуют в результатах. Этот предикат фильтра пропускается для базового типа сущности, так как при запросе базовой сущности будут получаться результаты для всех сущностей в иерархии. Если при материализации результатов запроса мы сталкиваемся с дискриминирующим значением, которое не сопоставлено ни с каким типом сущности в модели, мы создадим исключение, так как не знаем, как материализовать результаты. Эта ошибка возникает, только если база данных содержит строки с дискриминаторными значениями, которые не сопоставлены в модели EF. Если у вас есть такие данные, можно пометить дискриминационное сопоставление в модели EF Core как неполное, чтобы указать, что мы всегда должны добавлять предикат фильтра для запроса любого типа в иерархии. IsComplete(false) вызов в конфигурации дискриминатора помечает сопоставление как неполное.
C#Копировать
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasDiscriminator()
.IsComplete(false);
}

Download 39.18 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling