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