2010-07-14 50 views
4

我有一個簡單的'TODO'列表的Silverlight 4應用程序。我遇到的問題是數據綁定掛鉤了我的TODO對象上的關係,這會導致RIA數據上下文在我需要它之前將它添加到DataContext.TODOs列表中。 我想將對象視爲新對象並分離,直到我明確準備將其添加到datacontext。如何在我準備好之前防止Silverlight RIA實體附加到datacontext


下面是它如何工作的: 我已經得到了其與Status(RIA服務實體關係)有關我TODO實體。

我創建了一個新的TODO()實體,它被傳遞給ChildWindow彈出窗口。請注意,我不會將這個新實體添加到我的datacontext中。

new CreateTODOPopup(new TODO()).Show(); 

在我ChildWindow數據形我有Status一個ComboBox這是數據綁定到DataContext.Statuses

的問題是,選擇從下拉列表中選擇Status的作用下,實體實際上關聯到我的背景 - 結束了給它的EntityState.New的狀態,實際上它添加到DataContext.TODOs colleciton。

這樣會很好,除了它現在出現在主框架的主TODO列表中。我不想要這個,因爲它還沒有被ChildWindow提交。

我該如何解決這個問題?通過阻止實體被附加 - 或者以某種方式將它從任何控制中隱藏起來,直到它被添加爲止。

回答

0

您是否嘗試過在對象上使用Context.Detach,以便您明確指定它不應該在上下文中?然後,您可以在保存之前再次使用Context.Attach。

+1

我從來沒有explititly附加它,它只是重視自己。我不知道什麼時候我會分開它 – 2010-07-14 21:18:00

1

您應該能夠通過使用分部類爲TODO實體添加另一個「MyProject」屬性來獲得所需的行爲。在你的彈出窗口中,你可以設置'MyProject'屬性而不是'Project'屬性。當你保存你的TODO時,你可以直接將'MyProject'的值應用到'Project'中。有點迂迴,但它應該給你你想要的行爲。

凱爾

+0

偷偷摸摸的+1。當然不是可擴展但有趣的想法 – 2010-07-14 20:53:11

+0

另一種方法可能是使用StatusId而不是Status來創建關聯。我從兩種方法中看到了不同的行爲。 – 2010-07-19 19:55:50

1

我想一個方法是使用一個PagedCollectionView並篩選出「新」實體 - 但必須有明顯的東西你錯過了。

// data bind list to this ICollectionView 
    private PagedCollectionView _projects; 
    public PagedCollectionView Projects 
    { 
     get 
     { 
      if (_projects == null) 
      { 
       _projects = new PagedCollectionView(_todoDomainContext.TODOProjects) 
       { 
        Filter = i => { 

         DM.TODOProject proj = (DM.TODOProject)i; 

         // hide New entities 
         if (proj.EntityState == EntityState.New) 
         { 
          return false; 
         } 

         return true; 
        } 
       }; 
      } 
      return _projects; 
     } 
    } 
+2

oops。我寫給第三個人......給我自己......: - / – 2010-07-18 03:52:17

1

重要:後3天,一個可怕的種族類型條件掙扎它竟然是直接相關的問題。基本上,結論是 - 如果您嘗試創建實體並且不將它們添加到數據上下文中,那麼不需要,前提是您不需要競爭條件和意外行爲。我很確定這是一個RIA服務錯誤。

我在做什麼:

  • 創建new TODO()並將它傳遞給我的看法
  • 允許RIA服務框架,以我TODO所有的外鍵的表相關聯,如StatusAssignedTo
  • 在'保存'上將TODO()添加到列表中,如果它尚未出現在DataContext.TODOs實體集中。

什麼框架做本身:

  • 當視圖設置對象(通過comobox)的外鍵會自動添加TODODataContext.TODOS集合。這只是實體工作的方式。

爲什麼這是不好:

  • 當在我UI瀏覽一些可怕的競爭條件存在的。
  • 預先存在的行(即使在我的應用程序啓動之前存在的那些行)被標記爲New - 有時最多可以有20行,然後重新保存爲新的重複行。

我如何固定它:

  • 始終創建實體立即添加到數據上下文的創建。

下面是關於創造馬上加入實體的一些示例代碼 - 無競爭狀態:

for (int i = 0; i < 3; i++) 
{ 
    var entity = new DM.TODO(); 
    _todoDomainContext.TODOs.Add(entity); 

    entity.TODOStatu = pendingStatus; 
    entity.TODOProject = project; 
    entity.TODOCompany = company; 

    entity.CreateDt = DateTime.Now; 

    entity.Title = "generated todo " + DateTime.Now.ToString(); 
    entity.Details = "12345"; 
} 

此代碼沒有工作,並且將導致競爭 - 外鍵約束條件之後,將實體已經設置:

for (int i = 0; i < 3; i++) 
{ 
    var entity = new DM.TODO(); 

    entity.TODOStatu = pendingStatus; 
    entity.TODOProject = project; 
    entity.TODOCompany = company; 

    entity.CreateDt = DateTime.Now; 

    entity.Title = "generated todo " + DateTime.Now.ToString(); 
    entity.Details = "12345"; 

    _todoDomainContext.TODOs.Add(entity); 
} 
相關問題