检查是否启用了延迟加载

Check if lazy loading is enabled

我有以下型号:

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));

如果未启用延迟加载,则不会填充用户 属性。 如果有人在没有启用延迟加载的情况下尝试使用我的服务,我想抛出一个异常。怎么做?我试图检查 属性 _dbContext.ChangeTracker.LazyLoadingEnabled,但是这个 属性 总是正确的,即使我没有启用延迟加载...

您可能误解了延迟加载的用法,提到其他用户可以在不启用延迟加载的情况下使用您的服务。客户端不会打开或关闭延迟加载,这取决于您实现后端以确保您检查 EF 的空导航属性是否存在。

延迟加载是 EF Core 2.1 中的一项通用功能,允许您仅在导航属性被访问时加载它们。这些属性必须是虚拟的,并且 class 不能被密封。

也许您在致电客户服务时误解了 "proxies" 这个词。无论如何,实现后端的是您,必须看穿您的数据模型是否不一致。客户端无法打开或关闭延迟加载。

如果你不是在谈论你的同事在工作中会从另一层调用EF代码,比如数据层。然后你必须看穿 null 检查是否正确完成。延迟加载通常是一件好事,但您可以进行预先加载,例如 .Include 以防您想要加载导航属性。

我找到了解决方案(感谢 Tore Aurstad 的提示)。 我在我的 DbContext 中覆盖了 OnConfiguring 方法:

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

那么我们不需要在启动时使用UseLazyLoadingProxies()方法class来启用延迟加载