2010-05-24 4 views
5

J'ai un modèle de serveur très simple qui inclut une entité parente avec une liste [Entité] d'entités enfants. Dans mon client, j'ai 2 fonctions. Une fonction supprime toutes les entités enfant du parent et l'autre supprime tout et édite également une propriété sur l'entité parent.DomainContext parfois encore HasChanges après l'exécution de SubmitChanges

Lorsque je supprime simplement toutes les entités enfant et SubmitChanges(), tout va bien.

Lorsque je supprime toutes les entités enfants et modifier le parent et SubmitChanges(), il reste des modifications en attente (HasChanges == true) lorsque le rappel SubmitChanges() est déclenché. J'utilise Silverlight 4 RTM et RIA Services 1.0 RTM.

Des idées ce qui se passe ici?

Voici les entités du serveur:

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; } 
} 

Et voici le code client:

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(); 
     } 
    } 
} 

Lorsque vous exécutez ce code, la ChildWindow n'apparaît que lorsque vous la méthode ClearCitiesEditRegion() est appelée . La seule différence entre ceci et la méthode ClearCities() est la ligne où je édite la propriété region.Name.

Vous pouvez également télécharger un exemple de projet qui reproduit ce ici: http://dl.dropbox.com/u/2393192/RIA_Services_Problem.zip

Répondre

4

J'ai reçu une réponse à cela sur les forums Silverlight. Apparemment, c'est un bug dans RIA Service 1.0. Ce qui suit est Matthew's response on the Silverlight forums.

Oui, j'ai confirmé que c'est un bug. Merci de nous le signaler et de fournir le repro. Comme vous l'avez découvert, le bogue ne reprogramme que les scénarios de composition où le parent a été modifié en plus d'un ou plusieurs enfants . La solution de contournement consiste à effectuer un explicit AcceptChanges si l'envoi a réussi. Par exemple, voici le code que vous écririez dans un rappel soumettre :

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

Cela acceptera toutes les modifications et réinitialiser correctement état de changement.

+0

hey ce qui est "ctxt" dans sa solution de contournement? Je suis probablement confronté au même problème. Merci –