代码之家  ›  专栏  ›  技术社区  ›  joshuapoehls

在SubmitChanges完成后,DomainContext有时仍具有更改

  •  5
  • joshuapoehls  · 技术社区  · 14 年前

    我有一个非常简单的服务器模型,其中包含一个父实体和一个子实体的[组合]列表。在我的客户机中,我有两个功能。一个函数从父实体中删除所有子实体,另一个函数删除所有子实体,并编辑父实体的属性。

    当我简单地删除所有子实体和submitChanges()时,一切都很好。

    当我移除所有子实体时 编辑父级和SubmitChanges(),在激发SubmitChanges()回调时仍有挂起的更改(hasChanges==true)。

    我使用的是SilverLight4 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();
            }
        }
    }
    

    运行此代码时,仅当调用ClearCitiesEditRegion()方法时,才会显示ChildWindow。此方法与clearchities()方法的唯一区别是我在其中编辑region.name属性的行。

    您还可以在此处下载复制此内容的示例项目: http://dl.dropbox.com/u/2393192/RIA_Services_Problem.zip

    1 回复  |  直到 14 年前
        1
  •  4
  •   joshuapoehls    14 年前

    我在Silverlight论坛上收到了这个问题的答案。显然这是RIA服务1.0中的一个错误。以下是 Matthew's response on the Silverlight forums .

    是的,我已经确认这是一个错误。 感谢您报告并提供 复制品正如你发现的那样 只能在合成中重复 父级所处的方案 除一个或多个之外修改的 孩子们。解决方法是 如果提交 成功了。例如,这里是 在提交中编写的代码 回调:

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

    这将接受所有更改并重置 正确更改状态。