我有一个非常简单的服务器模型,它包含一个带有子实体[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; }
}
这是客户端代码:
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
答案 0 :(得分:4)
我在Silverlight论坛上收到了这个答案。显然这是RIA Service 1.0中的一个错误。以下是Matthew's response on the Silverlight forums。
是的,我已经确认这是一个错误。 感谢您报告并提供 复制者。正如你所发现的,这个bug 只会在作文中重演 父母的情景 除了一个或多个之外还修改 儿童。解决方法是做一个 如果提交,则显式AcceptChanges 那是成功的。例如,这是 你在提交中写的代码 回调:
if (!submitOperation.HasError)
{
((IChangeTracking)ctxt.EntityContainer).AcceptChanges();
}
这将接受所有更改并重置 正确地改变状态。