检查是否启用了延迟加载

时间:2018-12-27 20:01:36

标签: c# entity-framework-core lazy-loading entity-framework-core-2.1

我有以下模型:

thingsToTv.setText(sb, BufferType.SPANNABLE);

另一个库中的服务方法:

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

如果未启用延迟加载,则不会填充Users属性。 如果有人尝试在未启用延迟加载的情况下使用我的服务,则我想抛出异常。怎么做?我尝试检查属性 services.AddDbContext<DataContext>(options => options .UseLazyLoadingProxies() .UseSqlServer(connString)); ,但是即使我没有启用延迟加载,该属性也始终为真...

2 个答案:

答案 0 :(得分:1)

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

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

也许您在通过客户服务电话误解“代理”一词。无论如何,实现数据后端必须一致的是您实施后端。客户端无法打开或关闭延迟加载。

如果您不是在谈论要在工作中使用的同级设备,那么它们将从另一层(例如数据层)调用EF代码。然后,您必须了解是否正确完成了空检查。延迟加载通常是一件好事,但是您可以急切加载,例如.include,以防您要加载导航属性。

答案 1 :(得分:1)

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

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

然后,我们无需在启动类中使用UseLazyLoadingProxies()方法来启用延迟加载