Ленивые загрузочные прокси EF Core возвращают ноль случайно вместо сущностей - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть приложение. Net Core 3.1 с базой данных SQL. Я использую прокси с отложенной загрузкой для автоматического извлечения данных из связанных таблиц. По сути, у меня есть таблица, которая ссылается на некоторые другие объекты через отношение 1-ко-многим или 1-к-1. Дело в том, что в большинстве случаев все отношения в порядке, каждая сущность загружена, и я могу прочитать ее свойства (например, поле имени).

Но, в очень специфических c случаях, эти сущности не будет загружаться , хотя отношение Id есть. Это выглядит так:

Модель выглядит следующим образом:

public partial class Delegation
{
    public Guid Id { get; set; }
    public int UserFrom { get; set; }
    public int UserTo { get; set; }

    public virtual User UserFromNavigation { get; set; }
    public virtual User UserToNavigation { get; set; }
}

Инициализация внутри контекста базы данных:

public virtual DbSet<Delegation> Delegations { get; set; }
...
modelBuilder.Entity<Delegation>(entity =>
{
    entity.Property(e => e.Id).ValueGeneratedNever();

    entity.HasOne(d => d.UserFromNavigation)
        .WithMany(p => p.DelegationsUserFromNavigation)
        .HasForeignKey(d => d.UserFrom)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK_Delegations_Users_From");

     entity.HasOne(d => d.UserToNavigation)
        .WithMany(p => p.DelegationsUserToNavigation)
        .HasForeignKey(d => d.UserTo)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK_Delegations_Users_To");
});

Этот конкретный пример c является только одним из Многие также не загружают виртуальные ICollections других объектов в других моделях.

Здесь, на снимке экрана отладки, UserTo в порядке, но UserFrom НЕДЕЙСТВИТЕЛЕН.

UserTo is OK, but UserFrom is NULL

Ручной поиск сущности по Id и получение ее свойств работает, но делает код намного грязнее.

Есть ли способ заставить EF загрузить эти недостающие объекты или я здесь ошибаюсь? Такое поведение выглядит действительно случайным.

1 Ответ

1 голос
/ 28 февраля 2020

Вам необходимо включить UserToNavigation в ваш запрос как:

var delegation = rmsContext.Delegations.Include(x => x.UserToNavigation).Find(id);

для доступа к данным БД, попробуйте использовать async / await. Ваш запрос станет:

 var delegation = await rmsContext.Delegations.Include(x => x.UserToNavigation).FindAsync(id);
...