在SubmitChanges完成后,DomainContext有时仍然是HasChanges

jos*_*hls 5 silverlight silverlight-4.0 wcf-ria-services

我有一个非常简单的服务器模型,其中包含一个父实体,其中包含子实体的[Composition]列表.在我的客户端,我有2个功能.一个函数从父项中删除所有子实体,另一个函数删除所有子实体,并在父实体上编辑属性.

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

当我删除所有子实体编辑父实体 SubmitChanges()时,在触发SubmitChanges()回调时仍有待更改(HasChanges == true).

我正在使用Silveright 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; }
}
Run Code Online (Sandbox Code Playgroud)

这是客户端代码:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此代码时,只有在调用ClearCitiesEditRegion()方法时才会显示ChildWindow.它和ClearCities()方法之间的唯一区别是我编辑region.Name属性的行.

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

jos*_*hls 4

我在 Silverlight 论坛上收到了对此的答复。显然这是 RIA Service 1.0 中的一个错误。以下是Matthew 在 Silverlight 论坛上的回复

是的,我已经确认这是一个错误。感谢您报告并提供重现。正如您所发现的,该错误只会在除一个或多个子级之外还修改了父级的组合场景中重现。解决方法是在提交成功时执行显式 AcceptChanges。例如,以下是您在提交回调中编写的代码:

   if (!submitOperation.HasError)
   {
      ((IChangeTracking)ctxt.EntityContainer).AcceptChanges();
   }
Run Code Online (Sandbox Code Playgroud)

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