0

Telerik OpenAccess ORM に (さらに) いくつかの問題があります。今回は、フェッチ戦略をクエリに適用する領域について説明します。これがコードです...

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が事前に読み込まれることが期待されます。ただし、デバッガーでエンティティ変数を見ると、「展開するとプロパティの内容が列挙される」ことがわかります。これは、プロパティがまだ事前に入力されていないことを示唆しています。 FetchStrategy の

何か不足していますか?

4

1 に答える 1

1

エンティティ オブジェクトのナビゲーション プロパティは IEnumerable 型であるため、この動作は正常です。したがって、それらがメモリにプリロードされている場合でも、アクセスするにはそれらを列挙する必要があります。

FetchStrategy で指定されたナビゲーション プロパティがプリロードされていることを確認するには、それらにアクセスするときに生成される SQL スクリプトがあるかどうかを確認します。

Car オブジェクトに関連する RentalOrders がプリロードされている次の例を考えてみましょう。ToList() メソッドを実行すると列挙されますが、FetchStrategy によってプリロードされているため、executedScript は空のままです。

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 に答える