silverlight - 在 SubmitChanges 完成后,DomainContext 有时仍为 HasChanges

标签 silverlight silverlight-4.0 wcf-ria-services

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

当我简单地删除所有子实体和 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; }
}

这是客户端代码:
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。这与 ClearCities() 方法之间的唯一区别是我编辑 region.Name 属性的那一行。

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

最佳答案

我在 Silverlight 论坛上收到了对此的回答。显然这是 RIA Service 1.0 中的一个错误。以下是Matthew's response on the Silverlight forums .

Yes, I've confirmed this is a bug. Thanks for reporting it and providing the repro. As you discovered, the bug will only repro in composition scenarios where the parent has been modified in addition to one or more children. The workaround is to do an explicit AcceptChanges if the submit was successful. For example, here is the code you'd write in a submit callback:


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

This will accept all changes and reset change state correctly.

关于silverlight - 在 SubmitChanges 完成后,DomainContext 有时仍为 HasChanges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2899696/

相关文章:

银光 4 : Free Split Button

c# - 添加新实体后是否需要调用域服务的 context.SaveChanges?

c# - WP7 ListBox如何允许用户订购项目

.net - Silverlight 本地化 - 如何覆盖 Windows 区域性

silverlight - 我可以使用 Silverlight 的 WriteableBitmap 将 UI 的不可见部分保存到位图吗?

c# - 为什么 IEntityCollection 是内部的/如何查找 EntityCollection<T>.Count?

WCF RIA 服务授权

c# - 用户控件内的 WPF Scrollviewer 不显示垂直滚动条

silverlight - 与 Silverlight 相比,GET 可以给我带来哪些优势?

silverlight - 如何以编程方式在 Silverlight 中创建一个没有复选框(只是选中)的复选框?