Значения реляционных столбцов не заполняются после извлечения данных из базы данных?

#database #asp.net-core #entity-framework-core

#База данных #asp.net-core #entity-framework-core

Вопрос:

Я использую подход, ориентированный на базу данных, для генерации моделей из существующей базы данных. Для этого я успешно запускаю эту команду

 Scaffold-DbContext "Server=(localdb)mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models 
  

Я получаю все модели и контекстный файл.
Проблема:
Когда я пытаюсь извлечь данные из базы данных, используя Context.tableName, заполняются все значения модели, кроме реляционных полей. Например

         public DateTime? DateCreation { get; set; }
        public double? Discount { get; set; }
        public double? Rate { get; set; }
        public DateTime? DateModified { get; set; }

        public virtual Packaging Packaging { get; set; }
  

Здесь Packaging всегда остается нулевым, даже если данные существуют в связанной таблице для этой записи. Вот соответствующий код из контекстного файла

 entity.HasOne(d => d.Packaging)
                    .WithMany(p => p.PackagingLogs)
                    .HasForeignKey(d => d.PackagingId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_PackagingLogs_Packaging");
  

Возможно, мне чего-то не хватает, но у меня это никогда не работает ни в одной модели. Помощь будет оценена. Спасибо

Комментарии:

1. Загрузка связанных данных

Ответ №1:

Вообще говоря, вы должны либо с готовностью, либо явно загрузить взаимосвязь. У вас это не произойдет автоматически. Например:

 _context.Foos.Include(x => x.Packaging)
  

Вместо этого вы можете выбрать отложенную загрузку, но это должно быть явно включено:

 services.AddDbContext<MyContext>(o => o.UseLazyLoadingProxies()
      .UseSqlServer(myConnectionString));
  

Однако отложенная загрузка в конечном итоге приведет к выдаче запроса для отношения JIT (как раз вовремя) при обращении к свойству reference. Это означает, что вы можете легко получить сценарий запроса N 1, в котором вы в конечном итоге будете засыпать свою базу данных спамом с запросами. Вы всегда должны с готовностью загружать любые отношения, которые вы собираетесь использовать с Include в качестве предпочтительного подхода.