检查是否启用了延迟加载
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来启用延迟加载
我有以下型号:
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来启用延迟加载