EF Ядро отношение один к одному к нулю, не возвращающее данные в результате - PullRequest
0 голосов
/ 22 января 2019

В настоящее время я нахожусь в процессе миграции существующего дизайна базы данных в новое приложение с использованием 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 Ответ

0 голосов
/ 22 января 2019

В 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, связанные с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...