Наследование в entity framework
Таблица на иерархию и дискриминаторная конфигурация
Download 39.18 Kb.
|
NASLEDOVANIYE ...
Таблица на иерархию и дискриминаторная конфигурация
По умолчанию EF сопоставляет наследование с помощью шаблона таблицы на иерархию (TPH). TPH использует одну таблицу для хранения данных для всех типов в иерархии, а столбец дискриминатора используется для определения типа, представляемого каждой строкой. Приведенная выше модель сопоставлена со следующей схемой базы данных (обратите внимание на неявно созданный Discriminator столбец, который определяет, какой тип хранится в каждой Blog строке). Можно настроить имя и тип столбца дискриминатора, а также значения, используемые для идентификации каждого типа в иерархии: C#Копировать protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity .HasDiscriminator .HasValue .HasValue } В приведенных выше примерах 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling