Подтвердить что ты не робот

EF Code First Lazy loading Не работает

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

public class Merchant : User
{
    ...

    public virtual ICollection<MerchantLocation> MerchantLocations { get; set; }
}

public class MerchantLocation : BaseEntity
{
    ...

    public int MerchantId { get; set; }
    public virtual Merchant Merchant { get; set; }       
}

public class User : BaseEntity
{
    ...
}

public class BaseEntity
{
    ...

    public int Id { get; set; }
}

Я тестирую свою ленивую загрузку местоположений через следующий код (который не работает):

public void Test_Lazy_Loading() {
    using (var context = new MyDbContext()) {
        var merchant = context.Users.OfType<Merchant>.First();
        merchant.MerchantLocations.ShouldNotBeNull(); // fails
    }
}

Однако интенсивная загрузка работает нормально:

public void Test_Eager_Loading() {
    using (var context = new MyDbContext()) {
        var merchant = context.Users.OfType<Merchant>.Include("MerchantLocations").First();
        merchant.MerchantLocations.ShouldNotBeNull(); // passes
    }
}

MerchantLocations отмечен как public virtual, поэтому я не уверен, в чем проблема. Я также добавил следующее в свой конструктор DbContext:

Configuration.LazyLoadingEnabled = true;
Configuration.ProxyCreationEnabled = true;

edit: Я также заметил, что объект merchant, возвращаемый в вышеуказанных тестах, не является прокси-сервером EF. Это простая merchant. Я подозреваю, что это вызывает проблему.

4b9b3361

Ответ 1

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