Первая ошибка кода объекта, когда поле имеет значение null - PullRequest
0 голосов
/ 13 января 2020

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

public class SubjectsDbContext : DbContext
{
    public virtual DbSet<Subject> Subjects { get; set; }

    public SubjectsDbContext(string connectionString) : base(connectionString)
    {
    }

    public SubjectsDbContext()
    {

    }
}

public class Subject
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid SubjectId { get; set; }

    [Required]
    public virtual Course EnrolledCourse {get;set;}

    [Required]
    [Column(TypeName = "varchar")]
    [StringLength(64)]
    public string FullName { get; set; }
}

[Table("Courses")]
public class Course
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid CourseId { get; set; }

    [Required]
    public string CourseName { get; set; }
}

}

Я могу создать новые записи, и данные отправляются в базу данных правильно, как и ожидалось.

Однако, если я пытаюсь получить субъекты по

dbContext.Subjects

, я получаю список правильно, но когда я получаю доступ к объекту субъекта

dbContext.Subjects.First()

Поле участника курса является пустым. В чем проблема?

В отладчике я получаю эту ошибку

((System.Data.Entity.DynamicProxies.Subject_6FCD2FAC29425D72CDE4D879DA7F242F07267C22C94FFE2051F99B13F) или исключение типа «Фольксваген»). System.Data.Entity.Core.EntityCommandExecutionException

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Это когда мы говорим о отложенной загрузке и нетерпеливой загрузке.

отложенная загрузка. Когда объект впервые читается, он читает только объект, но не любые связанные данные (объект) ). Технически это приводит к тому, что несколько запросов отправляются в базу данных. Например:

dbContext.Subjects;

Стремительная загрузка. Когда вы читаете объект, вместе с ним извлекаются связанные данные. Это делает только один Sql запрос соединения, который извлекает все необходимые данные. Вы определяете готовность к загрузке с помощью метода Include.

var subjects= context.Subjects
            .Include(s ⇒ s.Courses).ToList();

Вам необходимо использовать загрузку Eager, чтобы курсы были загружены как часть запроса.

Примечание. Ленивая загрузка и активная загрузка - очень мощные концепции в платформе Entity. Необходимо использовать их соответствующим образом для достижения хорошей производительности и эффективности.

0 голосов
/ 13 января 2020

ОК, во-первых, я предположил, что поле члена было пустым, оно не было выброшено как исключение. «Уже есть открытый DataReader, связанный с этой командой».

Оказывается, я пропустил MultipleActiveResultSets = true в моей sql строке подключения.

...