2010-05-24 3 views
5

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

Odpowiedz

4

Otrzymałem odpowiedź na to na Silverlight forach. Najwyraźniej jest to błąd w usłudze RIA 1.0. Poniżej znajduje się Matthew's response on the Silverlight forums.

Tak, potwierdziłem, że to błąd. Dziękujemy za zgłoszenie i dostarczenie repro z numerem . Jak się dowiedziałeś, błąd będzie odtworzony tylko w scenariuszach, w których rodzic został zmodyfikowany jako dodatek do jednego lub większej liczby dzieci . Obejście problemu polega na wykonaniu wyraźnych AcceptChanges , jeśli przesłanie zakończyło się powodzeniem. Na przykład, oto kod chcesz pisać w przedłożenia zwrotnego:

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

To będzie akceptować wszystkie zmiany i przywrócić zmiana stanu poprawnie.

+0

hej co to jest "ctxt" w jego obejściowej odpowiedzi? Prawdopodobnie mam ten sam problem. Dzięki –

Powiązane problemy