我将“读取上下文”与“立即写入”分开了,我将默认在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核心v 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: 尝试将导航属性“ PartnerUsers”延迟加载到 类型为“ PartnerProxy”的独立实体。不支持延迟加载 用于分离的实体或已加载的实体 'AsNoTracking()'。”。可以抑制或记录此异常 将事件ID'CoreEventId.DetachedLazyLoadingWarning'传递给 'DbContext.OnConfiguring'中的'ConfigureWarnings'方法或 “ AddDbContext”。
该问题如何解决?
答案 0 :(得分:1)
您正在代码中的某个地方使用AsNoTracking()
,使用AsNoTracking()
方法时,延迟加载将无效。
您有两个选择:
使用Include()
方法加载您的关系
忽略警告,只需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");
}
答案 1 :(得分:1)
如果您使用 UseLazyLoadingProxies(),则必须使用 CreateProxy() 来启用延迟加载。
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;
}