Значения реляционных столбцов не заполняются после извлечения данных из базы данных? - PullRequest
0 голосов
/ 03 апреля 2019

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

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 всегда остается NULL, даже если для соответствующей записи существуют данные в соответствующей таблице. Вот соответствующий код из файла контекста

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

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

1 Ответ

0 голосов
/ 03 апреля 2019

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

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

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

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

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

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