【问题标题】:Telerik Open Access FetchStrategy does not seem to be applied to my queryTelerik Open Access FetchStrategy 似乎不适用于我的查询
【发布时间】:2015-08-24 15:55:56
【问题描述】:

我的 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;

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

我错过了什么吗?

【问题讨论】:

    标签: c# telerik telerik-open-access


    【解决方案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();
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 您的解释是我的解决方案...谢谢:) ...但是您的检查技术问题(至少在我的情况下)是为了确定该属性是否为预装我将不得不调用它。如果它一开始没有预加载,那么一旦调用它就会被加载。我不想加载它...只是找出它是否已加载。不过,我也设计了一种技术来解决这个问题。这有点手动,但似乎有效。如果有机会,我可以将其添加到 OP 中。
    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多