使用 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 加载相关对象?的主要内容,如果未能解决你的问题,请参考以下文章

LazyLoading 和 SCAM 架构的路由问题

我的具有许多关系的属性必须使用 ICollection 来支持 Entity Framework 4.1 中的 LazyLoading?

Ef core LazyLoading - 访问集合类型的嵌套导航属性引发 DetachedLazyLoadingWarning 错误

Ef核心LazyLoading - 类型集合的访问嵌套导航属性抛出DetachedLazyLoadingWarning错误

EF的三种数据加载方式

EF Core 2.1 中的 Eager loadingExplicit loading和LazyLoading (转自MSDN)