使用 Lazyloading,如何在处理完其 DBContext 后使用新的 DbContext 加载相关对象?
Posted
技术标签:
【中文标题】使用 Lazyloading,如何在处理完其 DBContext 后使用新的 DbContext 加载相关对象?【英文标题】:Using Lazyloading, how to load a related object after disposal of its DBContext by using a new DbContext? 【发布时间】:2021-10-10 14:41:39 【问题描述】:我有一个通用方法,用于从数据库中提取实体。
在这个通用方法中,我使用 IDbContextFactory 来获取我可以查询的 DbContext 对象。
public virtual List<T> GetTableRecordsByPartialInstance<T>(T whereObject) where T : class, ITable
using (SqlDboDbContext cntx = _DboContextFactory.CreateDbContext())
string tableName = cntx.Model.FindEntityType(typeof(T)).GetTableName();
string query;
List<SqlParameter> parameters;
GetQuery_NotNullWhereJoinWithAnd(whereObject, tableName, out query, out parameters);
IQueryable<T> queryObj = null;
try
queryObj = cntx.Set<T>().FromSqlRaw(query, parameters.ToArray());
return queryObj.ToList();
catch (Exception e)
Console.WriteLine(e.Message);
string strQuery = "";
strQuery = queryObj.ToQueryString();
throw;
这适用于不相关但我遇到问题/警告的对象
System.Reflection.TargetInvocationException
Inner Exception 1:
InvalidOperationException: An error was generated for warning 'Microsoft.EntityFrameworkCore.Infrastructure.LazyLoadOnDisposedContextWarning': An attempt was made to lazy-load navigation 'PartyProfile.PartyProxy' after the associated DbContext was disposed.
当我尝试访问引用相关数据的模型中的数据时。
return typeof(TT).GetProperties().All(x => SomeMethod(x.GetValue(val)));
假设我发现了这个错误,我将如何将一个新的 DbContext 链接到这个 Lazy Loader 以便我可以获取数据?
有没有办法在尝试访问值之前检查属性以提前知道我需要生成/链接新的 DbContext?
【问题讨论】:
【参考方案1】:我将如何将一个新的 DbContext 链接到这个 Lazy Loader 以便我可以获取数据?
你不能。延迟加载代理绑定到单个 DbContext 实例。如果您想使用延迟加载,您应该为 DbContext 找到比 using
块更好的生命周期。
如果需要,您还可以将实体附加到以后的 DbContext 并显式加载相关实体。
【讨论】:
以上是关于使用 Lazyloading,如何在处理完其 DBContext 后使用新的 DbContext 加载相关对象?的主要内容,如果未能解决你的问题,请参考以下文章
我的具有许多关系的属性必须使用 ICollection 来支持 Entity Framework 4.1 中的 LazyLoading?
Ef core LazyLoading - 访问集合类型的嵌套导航属性引发 DetachedLazyLoadingWarning 错误
Ef核心LazyLoading - 类型集合的访问嵌套导航属性抛出DetachedLazyLoadingWarning错误
EF Core 2.1 中的 Eager loadingExplicit loading和LazyLoading (转自MSDN)