EF6 не обладает ленивой навигационной навигацией

c# entity-framework-6

Вопрос

У меня проблема с ленивой загрузкой EF6. Я искал StackOverflow, но другие вопросы, которые я нашел, не соответствуют моему делу.

Я использую ключевое слово virtual и мои классы являются public . LazyLoadingEnabled и ProxyCreationEnabled установлены в true .

Когда я загружаю объект course из db, presentationId устанавливается в правильный id а presentation - null что верно, потому что оно еще не загружено.

Когда я presentation свойство PresentationsController.ToDto() методу PresentationsController.ToDto() он должен быть ленивым, но я получаю исключение null reference в методе, потому что оно по-прежнему равно null .

Я знаю , что отношения работают , потому что , когда я заставляю загрузить presentation свойство course в Watch window с точкой разрыва в public static CourseDto ToDto(Course item, DnbContext db) метод он загружается. Смотрите изображения:

Как вы видите, item.presentation имеет значение null :

введите описание изображения здесь

Когда я вручную оцениваю db.courses.Find(257).presentation которое ссылается на ту же презентацию, что и объект item , они оба загружены:

введите описание изображения здесь

Вот мои POCOs:

public abstract class BaseModel : ISoftDelete {
    public int id { get; set; }
}

public class Course : BaseModel {
    [Required]
    public int presentationId { get; set; }
    public virtual Presentation presentation { get; set; }
}

Мои методы API-интерфейса API:

// GET api/Courses/5
public CourseDto GetCourse(int id) {
    var item = db.courses.FirstOrDefault(x => x.id == id);
    return ToDto(item, db);
}

public static CourseDto ToDto(Course item, DnbContext db) {
    var dto = new CourseDto();

    if (item.presentationId > 0) dto.presentation = PresentationsController.ToDto(item.presentation, db);

    return dto;
}

Есть идеи?

Принятый ответ

Сущности должны явно объявлять публичные конструкторы, если вы хотите использовать ленивую загрузку через динамические прокси. (Если у вас есть другие параметры)

public abstract class BaseModel : ISoftDelete {
    public BaseModel() { }
    public int id { get; set; }
}

public class Course : BaseModel {
    public Course() { }
    [Required]
    public int presentationId { get; set; }
    public virtual Presentation presentation { get; set; }
}



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему