EF Ядро отношение один к одному к нулю, не возвращающее данные в результате
В настоящее время я нахожусь в процессе миграции существующего дизайна базы данных в новое приложение с использованием EF Core 2.2.1 с первыми миграциями кода. Наш текущий дизайн имеет первичную таблицу, которая затем может иметь несколько вложенных таблиц с одним и тем же общим первичным ключом. Я посмотрел на этот похожий вопрос и попытался повторить ответ там, но мне не очень повезло с показом данных в результате.
Упрощенная схема выглядит примерно так:
public class Root
{
public enum SubEntityType
{
A,
B,
C,
D
}
public Guid Id { get; set; }
public SubEntityType Type { get; set; }
public virtual TypeA A { get; set; }
public virtual TypeB B { get; set; }
public virtual TypeC C { get; set; }
public virtual TypeD D { get; set; }
}
public class TypeA
{
public Guid Id { get; set; }
public virtual Root Root { get; set; }
public int A { get; set; }
}
public class TypeB
{
public Guid Id { get; set; }
public virtual Root Root { get; set; }
public Guid B { get; set; }
}
public class TypeC
{
public Guid Id { get; set; }
public virtual Root Root { get; set; }
public string C { get; set; }
}
public class TypeD
{
public Guid Id { get; set; }
public virtual Root Root { get; set; }
public bool D { get; set; }
}
Затем я установил отношения, используя свободный API следующим образом:
builder.Entity<Models.Root>()
.HasOne( e => e.A )
.WithOne( e => e.Root )
.HasForeignKey<Models.TypeA>( e => e.Id );
builder.Entity<Models.Root>()
.HasOne( e => e.B )
.WithOne( e => e.Root )
.HasForeignKey<Models.TypeB>( e => e.Id );
builder.Entity<Models.Root>()
.HasOne( e => e.C )
.WithOne( e => e.Root )
.HasForeignKey<Models.TypeC>( e => e.Id );
builder.Entity<Models.Root>()
.HasOne( e => e.D )
.WithOne( e => e.Root )
.HasForeignKey<Models.TypeD>( e => e.Id );
Кажется, он отлично работает, пока я не попытаюсь добавить данные. Я создаю корневую запись с некоторыми фиктивными данными. В root
Таблица:
Id Type
6f0f24cf-fbd7-4b4d-8059-0810daaf5460 1
В TypeA
Таблица:
Id A
6f0f24cf-fbd7-4b4d-8059-0810daaf5460 12
Все вставляет нормально и выглядит хорошо. Когда я запрашиваю это так:
var result = ctx.Root.First();
Я получаю следующий результат (извиняюсь за форматирование, пытался сделать его немного лучше):
Name Value
result {Test.Models.Root}
A null
B null
C null
D null
Id {6f0f24cf-fbd7-4b4d-8059-0810daaf5460}
Type B
не должны A
быть заполненным Test.Models.TypeA
объект с A
установлен в 12
? Это оптимизация, которую делает EF, и мне нужно загрузить A
по требованию или я неправильно настроил отношения? Или же мой подход неверен, и я должен делать это по-другому?
1 ответ
В Entity Framework Core свойства виртуальной навигации не загружаются автоматически, пока вы не настроите Ленивую загрузку или не используете Eager Loading
с Include
,
Поэтому напишите ваш запрос следующим образом:
var result = ctx.Root.Include(r => r.TypeA).Include(r => r.TypeB)
.Include(r => r.TypeC).Include(r => r.TypeD).FirstOrDefault();
Сейчас Root
буду иметь TypeA
, TypeB
, TypeC
а также TypeD
связано с этим.