我已经将读上下文和写上下文分开了,现在我将在默认情况下在ReadOnlyContext中启用LazyLoading。我也使用了下面的方法,但不幸的是它不起作用。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer(@"Data Source=.;Initial Catalog=UniversityDb;Persist Security Info=True;User ID=admin;Password=asdasdsadasd");
}
我的模型:
public class Partner : BaseEntity<int>
{
public string Name { get; set; }
public DateTime CreateDate { get; set; }
public bool IsDisabled { get; set; }
public bool IsDeleted { get; set; }
public virtual ICollection<PartnerUser> PartnerUsers { get; set; }
}
我的ef版本:
EntityFramework核心版本2.1.2
public async Task<PartnerQuery> Get(int id)
{
var result = await _partnerDbSet.SingleAsync(c => c.Id == id);
var list = result.PartnerUsers;
return new PartnerQuery()
{
CreateDate = result.CreateDate,
Name = result.Name,
Id = result.Id
};
}
我得到了这个错误:
“为警告‘Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning’生成错误:尝试在类型为‘PartnerProxy’的分离实体上延迟加载导航属性‘PartnerUsers’。分离实体或使用‘AsNoTracking()加载的实体不支持延迟加载。”“.”。通过将事件ID“CoreEventId.DetachedLazyLoadingWarning”传递给“DbContext.OnConfiguring”或“AddDbContext”中的“ConfigureWarnings”方法,可以抑制或记录此异常。”
如何解决这个问题?
如果您使用UseLazyLoadingProxies(),则必须使用CreateProxy()来启用Lazy加载。
public async Task<PartnerQuery> Get(int id)
{
var result = await _partnerDbSet.SingleAsync(c => c.Id == id);
var list = result.PartnerUsers;
// assuming you have access to your database context
var model = myDatabaseContext.CreateProxy<PartnerQuery>();
model.CreateDate = result.CreateDate;
model.Name = result.Name;
model.Id = result.Id;
return model;
}
代理扩展
您在代码中的某个地方使用了AsNoTrack()
,当使用AsNoTrack()
方法时,懒惰加载将不起作用。
您有两个选择:
>
忽略警告,只需为您的关系获取null
您可以将EF配置为忽略此错误:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseLazyLoadingProxies()
.ConfigureWarnings(warnings => warnings.Ignore(CoreEventId.DetachedLazyLoadingWarning))
.UseSqlServer(@"Data Source=.;Initial Catalog=UniversityDb;Persist Security Info=True;User ID=admin;Password=asdasdsadasd");
}
当将实体模型转换为DTO时,我对Entity Framework Core(v2.0.1)有一个问题。基本上,通过该短语的任何其他版本,当我不想加载时,它是延迟加载的。这是一个简单的。NET Core Console应用程序(带有Microsoft. EntityFrameworkCore. SqlServer(2.0.1)包)。 现在,当执行方法来检索数据时,它正在执行以下SQL 如您所见,它没
我从这个网站上读到了关于懒惰加载的内容。启用或禁用LazyLoding “如果我们请求已启用LazyLoading的学生列表,数据提供程序将从数据库中获取所有学生,但每个StudentAddress属性在显式访问该属性之前不会加载。” 此语句表示,当我将设置为true时,将不会加载相关数据。然而 如果我设置延迟加载启用=true,上面的代码返回所有特技与他们的老师和地址。我在这里错过了什么?有人能
考虑以下(非常简化的)实体: 在我的映射器中,我可以设置用户罚款,但是一旦执行以下代码(在数据库中保留任何更改之前)
我正在使用启用延迟加载的实体框架5。我有以下代码: 但这有意义吗?我想确保公共属性订阅从不为null。由于虚拟实体框架覆盖了getter和setter以提供延迟加载功能。 我需要这个字段还是我可以只使用一个自动属性,如果没有订阅,我得到一个空列表?
当我从主viewController重定向到另一个viewController时,我得到了这个。 错误: Lazy 加载 NSBundle MobileCoreServices.framework, 已加载MobileCoreServices.framework, system group . com . apple . configuration profiles的系统组容器路径为/Users/
我听说应该在web应用程序中禁用EF的延迟加载功能。(ASP.NET)。首先,这里和这里。 现在我真的很困惑,因为我一直认为应该始终启用延迟加载,因为它可以防止从数据库中获取不必要的数据。所以,现在我的问题是:从性能角度来看,在网络应用中禁用懒惰加载是否是一个更好的主意。如果是,你能解释一下原因吗?