0

我的 Telerik OpenAccess ORM 有一些(更多)问题。这次是在将 Fetch Strategies 应用于查询的领域。这是代码...

using (DAL.DarkRoomDB ctx = new DarkRoomDB())
            {
                //
                // Set the resulting object to include the contents of the package 
                FetchStrategy strategy = new FetchStrategy();
                strategy.LoadWith<DeliverablePackageEntity>(c => c.PackageContents);
                strategy.LoadWith<DeliverablePackageContentEntity>(c => c.Deliverable);
                strategy.LoadWith<DeliverablePackageContentEntity>(c => c.DeliverablePackage);
                strategy.MaxFetchDepth = 3;
                ctx.FetchStrategy = strategy;
                //
                // get the package that matches the SKU
                DataStoreRepository<DeliverablePackageEntity> repo = DataStoreRepository<DeliverablePackageEntity>.GetInstance(ctx);
                DeliverablePackageEntity entity = repo.GetEntityList(c => c.PackageSku == SKU).FirstOrDefault();
                //
                // Create a DISCONNECTED COPY of the entity
                copy = ctx.CreateDetachedCopy<DeliverablePackageEntity>(entity, strategy); 

            }

            ret = EntityToDomainMapper.Map<DeliverablePackageEntity, DeliverablePackage>(copy);              
            return ret;

当我运行它时,我希望预加载DeliverablePackageEntityPackageContents 。但是,当我在调试器中查看实体变量时,它告诉我“扩展时将枚举属性的内容”,这表明该属性尚未预先填充,这就是我认为的目的FetchStrategy 是。

我错过了什么吗?

4

1 回答 1

1

这种行为是正常的,因为实体对象的导航属性属于 IEnumerable 类型。因此,即使它们预加载在内存中,您也需要枚举它们才能访问它们。

您可以通过检查访问时是否生成 SQL 脚本来验证 FetchStrategy 中指定的导航属性是否已预加载。

考虑以下示例,其中预加载了 Car 对象的相关 RentalOrders。执行 ToList() 方法后,它们将被枚举,但由于已由 FetchStrategy 预加载,因此执行脚本将保持为空:

using (EntitiesModel1 context = new EntitiesModel1())
{

    FetchStrategy loadWithRentalOrders = new FetchStrategy();
    loadWithRentalOrders.LoadWith<Car>(car => car.RentalOrders);
    context.FetchStrategy = loadWithRentalOrders;
    Car firstCar = context.Cars.First();

    context.Log = new StringWriter();
    List<RentalOrder> relatedOrders = firstCar.RentalOrders.ToList();
    //should be empty
    string executedScript = context.Log.ToString();
}

我希望这有帮助。

于 2015-08-25T12:43:38.753 回答