2

RIA と EF を使用して単一の DomainContext で複数のテーブルをクエリする Silverlight 4 アプリケーションがあります。BUGroup、BUGroupBuilding、および vwBusinessUnit。 ここに画像の説明を入力

UI は基本的に BUGroup エンティティ セットをロードし、別の BUGroup を選択すると、次のように子テーブルがロードされます。 ここに画像の説明を入力

次のように、[Manage Buildings] ボタンの子ウィンドウに渡す DomainContext があります。

        ManageBuildingsChildWindow ManageBuildingscw = new ManageBuildingsChildWindow();
        ManageBuildingscw.Closed += new EventHandler(ManageBuildingscw_Closed);            
        ManageBuildingscw.DataContext = null; 
        ManageBuildingsViewModel ManageBuildingsViewModel = new ManageBuildingsViewModel();                    
        ManageBuildingscw.DataContext = ManageBuildingsViewModel;

そして、次のように子ウィンドウビューモデルに子ウィンドウコンテキストをロードしています:

        GetBUGroupResult = SecurityDomainContext.Current.Load(SecurityDomainContext.Current.GetBUGroupsCustomQuery(), LoadBehavior.RefreshCurrent, false);
        GetBUGroupResult.Completed += new EventHandler(GetBUGroupResult_Completed);

GetBUGroupResult のイベント ハンドラは次のとおりです。

        void GetBUGroupResult_Completed(object sender, EventArgs e)
        {                
            GetBUGroupBuildings = SecurityDomainContext.Current.BUGroupBuildings.Where(w => w.BUGroupID == BUGroupID).ToList();
            GetBUGroupResult.Completed -= new EventHandler(GetBUGroupResult_Completed);               
        }

各 BUGroupBuilding をデータグリッドの削除リンクにバインドすると、データベースから削除されます。建物の管理ボタンをクリックして子ウィンドウを呼び出すと、初めて正常に読み込まれます。5 つの建物がある場合、5 つの建物を読み込みます。問題は、いくつかの建物を削除した後、2 回目以降にロードするときです。ロード後も古い DomainContext を保持します。GetBUGroupsCustomQuery() の Load で LoadBehavior を RefreshCurrent に設定してみます。

グループに 5 つの建物があり、削除リンクを使用して親ウィンドウで 2 つを削除したので、現在は 3 つあるとします。子ウィンドウを呼び出します。まだ5を示しています。 ここに画像の説明を入力

ここで、GetBUGroupsCustomQuery() の DomainServices を中断すると、正しい 3 つの値が返されます。 ここに画像の説明を入力

しかし、GetBUGroupResult_Completed イベント ハンドラーの間、まだ 5 つの建物が表示されています。loadbehavior を指定して current を更新しても、DomainContext が更新されないようです。入力はありますか?

ここに画像の説明を入力

4

2 に答える 2

1

次のこともできます。

var c = SecurityDomainContext.Current;
var group = c.BUGroups.Single(w => w.BUGroupID == BUGroupID);    
c.Refresh(RefreshMode.StoreWins, group.BUGroupBuildings);
GetBUGroupBuildings = group.BUGroupBuildings.ToList(); 

これによりRefreshMode.StoreWins、データベースの現在の状態が取得されることが保証されます。

于 2012-06-07T14:15:59.663 に答える