我有以下模型:
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));
,但是即使我没有启用延迟加载,该属性也始终为真...
答案 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()
方法来启用延迟加载