C# 识别LazyLoading是否在实体框架中直接在实体上处于活动状态

C# 识别LazyLoading是否在实体框架中直接在实体上处于活动状态,c#,entity-framework,C#,Entity Framework,在一个简单的web API调用中,我设置了db.Configuration.LazyLoadingEnabled=false。然后我通过实体框架从数据库中检索元素。使用显式转换将这些对象转换为exchange对象。这个交换类又包含使用显式转换的转换。现在,我想知道在这样一个cast方法中,延迟加载是否处于活动状态,而不知道实际的数据库上下文。是否有办法仅使用代理对象来确定这一点 原因是,如果exchange对象中的子元素列表未加载到代理对象中,我希望将其设置为NULL。然而(根据我的观察),列表

在一个简单的web API调用中,我设置了
db.Configuration.LazyLoadingEnabled=false。然后我通过实体框架从数据库中检索元素。使用显式转换将这些对象转换为exchange对象。这个交换类又包含使用显式转换的转换。现在,我想知道在这样一个cast方法中,延迟加载是否处于活动状态,而不知道实际的数据库上下文。是否有办法仅使用代理对象来确定这一点

原因是,如果exchange对象中的子元素列表未加载到代理对象中,我希望将其设置为NULL。然而(根据我的观察),列表只是创建为空,没有子元素。因此,我无法确切地看到数据库中是否实际上没有指定的子级,或者数据是否根本没有加载。有可靠的方法来找出这个问题吗

公共异步任务GetPlantsWithStorages(){ db.Configuration.LazyLoadingEnabled=false; //从数据库中获取列表 List plantList=等待数据库植物 .IncludeOptimized(plant=>plant.PlantAreas) .IncludeOptimized(plant=>plant.PlantAreas.Select(plantArea=>plantArea.Storages)) .IncludeOptimized(plant=>plant.PlantAreas.Select(plantArea=>plantArea.LoadingBays)) .OrderBy(plant=>plant.Name) .ToListAsync(); //强制转换并将结果返回给客户端 返回plantList.Select(p=>(Models.DataExchange.Plant)p); } 公共静态显式运算符存储位置(存储){ if(存储==null) 抛出新的ArgumentNullException(nameof(storage)); //storage.ChargeCarrier\我的示例中不会填充存储。 //但是,列表不是空的,而是空的列表。 //是否有类似于storage.ChargeCarrier\u storage.IsLoaded的内容? 返回新的StorageLocation(){ Description1=storage.Description1, Description2=storage.Description2, ID\u Storage=Storage.ID, ID\u StorageType=storage.ID\u StorageType, ChargeCarrier=存储。ChargeCarrier\u存储?。选择(ccs=>(ChargeCarrier)ccs.ChargeCarrier) }; }
不知道实际的数据库上下文。是否有办法仅使用代理对象来确定这一点

您可以检查实体的运行时类型。它将是来自动态程序集的代理类型,是来自定义实体的程序集的实体类型的替代。乙二醇

bool IsProxy(object entity)
{
    return System.Reflection.Assembly.GetExecutingAssembly() != entity.GetType().Assembly;
}
我无法确切地看到数据库中是否实际上没有指定的子项,或者数据是否根本没有加载。有可靠的方法来找出这个问题吗

正确的方法是通过DbContext。乙二醇

var areasLoaded = db.Entry(plant).Reference(a => a.PlantAreas).IsLoaded();