Проверьте, включена ли отложенная загрузка

У меня есть следующая модель:

public partial class User
{
    // other properties

    /// <summary>
    /// Gets or sets user roles
    /// </summary>
    public virtual IList<UserRole> UserRoles
    {
        get => _userRoles ?? (_userRoles = UserUserRoleMappings.Select(mapping => mapping.UserRole).ToList());
    }

    /// <summary>
    /// Gets or sets user-user role mappings
    /// </summary>
    public virtual ICollection<UserUserRoleMapping> UserUserRoleMappings
    {
        get => _userUserRoleMappings ?? (_userUserRoleMappings = new List<UserUserRoleMapping>());
        protected set => _userUserRoleMappings = value;
    }
}

и способ обслуживания в другой библиотеке:

    public virtual User GetUserByUsername(string username)
    {
        if (string.IsNullOrWhiteSpace(username))
            return null;

        var user = _dbContext.Users
            .Where(u => u.Username == username)
            .FirstOrDefault();

        return user;
    }

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

        services.AddDbContext<DataContext>(options => options
            .UseLazyLoadingProxies()
            .UseSqlServer(connString));

если отложенная загрузка не включена, свойство Users не заполняется. Я хочу выбросить исключение, если кто-то попытается использовать мой сервис без включенной отложенной загрузки. Как это сделать? Я пытался проверить собственность _dbContext.ChangeTracker.LazyLoadingEnabled, но это свойство всегда верно, даже я не включил ленивую загрузку...

2 ответа

Решение

Я нашел решение (спасибо Tore Aurstad за подсказку). Я переопределяю метод OnConfiguring в моем DbContext:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLazyLoadingProxies(true);
        base.OnConfiguring(optionsBuilder);
    }

Тогда нам не нужно использовать UseLazyLoadingProxies() метод в классе запуска для включения отложенной загрузки

Возможно, вы неправильно интерпретируете использование отложенной загрузки, упоминая, что другие пользователи могут использовать ваш сервис без включенной отложенной загрузки. Клиенты не будут включать или выключать отложенную загрузку, это зависит от вас, кто реализует бэкэнд, чтобы убедиться, что вы проверяете наличие нулевых навигационных свойств EF или нет.

Ленивая загрузка - это общая функция в EF Core 2.1, которая позволяет загружать свойства навигации только при обращении к ним. Эти свойства должны быть виртуальными, а класс не должен быть запечатан.

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

Если вы не говорите о своих коллегах на работе, то это вызовет код EF из другого уровня, например уровня данных. Затем вы должны убедиться, что проверка на ноль выполнена правильно. Ленивая загрузка, как правило, полезная вещь, но вы можете загружать ее, например,.Include, если вы хотите загрузить свойства навигации.

Другие вопросы по тегам