У меня есть очень простая модель сервера, которая включает родительский объект с [Состав] список дочерних объектов. В моем клиенте у меня есть 2 функции. Одна функция удаляет все дочерние объекты из родителя, и другой удаляет все и также редактирует свойство на родительском объекте.
Когда я просто удаляю все дочерние объекты и SubmitChanges (), все хорошо.
Когда я удаляю все дочерние объекты и редактирую родителя и SubmitChanges (), там все еще ожидают изменения (HasChanges == верный), когда SubmitChanges () обратный вызов запущен.
Я использую Silveright 4 RTM and RIA Services 1.0 RTM.
Какие-либо идеи, что продолжается здесь?
Вот объекты сервера:
public class RegionDto
{
public RegionDto()
{
Cities = new List();
}
[Key]
public int Id { get; set; }
public string Name { get; set; }
[Include]
[Composition]
[Association("RegionDto_CityDto", "Id", "RegionId")]
public List 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 () метод является строкой, где я редактирую регион. Свойство Name.
Можно также загрузить демонстрационный проект, который воспроизводит это здесь: http://dl.dropbox.com/u/2393192/RIA_Services_Problem.zip
Я получил ответ на это на форумах Silverlight. Видимо это ошибка в RIA Service 1.0. Ниже приводится ответ Мэтью на форумах Silverlight .
Да, я подтвердил, что это ошибка. Спасибо, что сообщили об этом и предоставили репро. Как вы обнаружили, ошибка буду воспроизводить только композицию сценарии, в которых родитель был изменен в дополнение к одному или нескольким дети.Обходной путь - выполнить явный AcceptChanges, если отправка Был успешен. Например, вот код, который вы бы написали в отправке callback:
if (!submitOperation.HasError)
{
((IChangeTracking)ctxt.EntityContainer).AcceptChanges();
}
Это примет все изменения и сбросит изменить состояние правильно.