Проверьте, включена ли отложенная загрузка - PullRequest
0 голосов
/ 27 декабря 2018

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

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 ]

0 голосов
/ 28 декабря 2018

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

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

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

0 голосов
/ 27 декабря 2018

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

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

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

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

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