Mam bardzo prosty model serwera, który zawiera nadrzędny podmiot z listy [Composition] podmiotów podrzędnych. W moim kliencie mam 2 funkcje. Jedna funkcja usuwa wszystkie elementy podrzędne z obiektu nadrzędnego, a druga usuwa wszystkie, a także edytuje właściwość w elemencie nadrzędnym.DomainContext czasami nadal HasChanges po SubmitChanges kończy
Kiedy po prostu usuń wszystkie elementy podrzędne i zmiany Prześlij(), wszystko jest dobrze.
Po usunięciu wszystkich obiektów podrzędnych i edytuj nadrzędne i Zmiany przesyłania(), nadal są oczekujące zmiany (HasChanges == true), gdy wywołanie zwrotne SubmitChanges() jest uruchomione.
Używam programów Silveright 4 RTM i RIA Services 1.0 RTM.
Jakieś pomysły, co się tutaj dzieje?
Oto jednostki serwerowe:
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; }
}
I tu jest kod klienta:
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();
}
}
}
Po uruchomieniu tego kodu ChildWindow jest pokazana tylko wtedy, gdy metoda ClearCitiesEditRegion() jest wywoływana . Jedyną różnicą między tą metodą a ClearCities() jest linia, w której edytuję właściwość region.Name.
Można również pobrać przykładowy projekt, który odtwarza ten tutaj: http://dl.dropbox.com/u/2393192/RIA_Services_Problem.zip
hej co to jest "ctxt" w jego obejściowej odpowiedzi? Prawdopodobnie mam ten sam problem. Dzięki –