2010-05-24 63 views
5

我有一個非常簡單的服務器模型,其中包含具有子實體[Composition]列表的父實體。在我的客戶中,我有兩個功能。一個函數從父項中移除所有子實體,另一個函數移除所有子實體並編輯父實體的屬性。DomainContext在SubmitChanges完成後有時仍然HasChanges

當我簡單地刪除所有子實體和SubmitChanges()時,一切都很好。

當我刪除所有子實體時,編輯父代和SubmitChanges(),當SubmitChanges()回調被觸發時,仍有未決更改(HasChanges == true)。

我使用的是Silverlight 4 RTM和RIA Services 1.0 RTM。

任何想法發生了什麼?

這裏是服務器實體:

public class RegionDto 
{ 
    public RegionDto() 
    { 
     Cities = new List<CityDto>(); 
    } 

    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    [Include] 
    [Composition] 
    [Association("RegionDto_CityDto", "Id", "RegionId")] 
    public List<CityDto> Cities { get; set; } 
} 

public class CityDto 
{ 
    [Key] 
    public int Id { get; set; } 

    public int RegionId { get; set; } 
    public string Name { get; set; } 
} 

這裏是客戶端代碼:

public static class CState 
{ 
    private static RegionDomainContext _domainContext; 

    public static RegionDomainContext DomainContext 
    { 
     get 
     { 
      if (_domainContext == null) 
      { 
       _domainContext = new RegionDomainContext(); 
      } 
      return _domainContext; 
     } 
    } 

    public static void SaveChanges() 
    { 
     DomainContext.SubmitChanges(op => 
     { 
      if (DomainContext.HasChanges && !DomainContext.IsSubmitting) 
      { 
       var w = new ChildWindow(); 
       w.Content = "The DomainContext still has unsaved changes."; 
       w.Show(); 
      } 
     }, null); 
    } 
} 

public partial class MainPage : UserControl 
{ 
    private void ClearCitiesEditRegion(object sender, RoutedEventArgs e) 
    { 
     var region = (RegionDto)regionList.SelectedItem; 

     if (region != null) 
     { 
      region.Name += "*"; 
      while (region.Cities.Count > 0) 
      { 
       region.Cities.Remove(region.Cities.First()); 
      } 

      CState.SaveChanges(); 
     } 
    } 

    private void ClearCities(object sender, RoutedEventArgs e) 
    { 
     var region = (RegionDto)regionList.SelectedItem; 

     if (region != null) 
     { 
      while (region.Cities.Count > 0) 
      { 
       region.Cities.Remove(region.Cities.First()); 
      } 

      CState.SaveChanges(); 
     } 
    } 
} 

當你運行該代碼ChildWindow只顯示在您的ClearCitiesEditRegion()方法被調用。這和ClearCities()方法之間的唯一區別是我編輯region.Name屬性的行。

您也可以下載,這在這裏再現樣本項目:http://dl.dropbox.com/u/2393192/RIA_Services_Problem.zip

回答

4

我收到了答案,這對Silverlight的論壇。顯然這是RIA Service 1.0中的一個錯誤。以下是Matthew's response on the Silverlight forums

是的,我已經證實這是一個錯誤。 感謝您報告它並提供 報告。正如您發現的,錯誤 只會在組合 中複製,其中除了一個或多個 孩子之外還修改了父代 。如果提交 成功,解決方法是執行 顯式AcceptChanges。例如,這裏是 你在提交 回調寫代碼:

if (!submitOperation.HasError) 
    { 
     ((IChangeTracking)ctxt.EntityContainer).AcceptChanges(); 
    } 

這會接受所有的變化和正確地重置 改變狀態。

+0

哎什麼是他的解決方法答案中的「ctxt」?我可能正面臨同樣的問題。謝謝 – 2014-05-07 13:35:12