2010-05-24 15 views
5

Tengo un modelo de servidor muy simple que incluye una entidad principal con una lista [Composition] de entidades secundarias. En mi cliente, tengo 2 funciones. Una función elimina todas las entidades secundarias del padre y la otra elimina todas y también edita una propiedad en la entidad padre.DomainContext a veces todavía HasChanges después de SubmitChanges completa

Cuando simplemente elimino todas las entidades secundarias y SubmitChanges(), todo está bien.

Cuando quito todas las entidades secundarias y editar los padres y SubmitChanges(), todavía hay cambios pendientes (HasChanges == true) cuando el SubmitChanges() de devolución de llamada se disparó.

Estoy usando Silveright 4 RTM y RIA Services 1.0 RTM.

¿Alguna idea de lo que está pasando aquí?

Estas son las entidades de servidor:

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

Y aquí está el código de cliente:

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

Cuando se ejecuta este código, el ChildWindow sólo se muestra cuando el método ClearCitiesEditRegion() se llama . La única diferencia entre esto y el método ClearCities() es la línea donde edito la propiedad region.Name.

También puede descargar un proyecto de ejemplo que reproduce esta aquí: http://dl.dropbox.com/u/2393192/RIA_Services_Problem.zip

Respuesta

4

he recibido una respuesta a esto en los foros de Silverlight. Aparentemente esto es un error en RIA Service 1.0. El siguiente es Matthew's response on the Silverlight forums.

Sí, he confirmado que se trata de un error. Gracias por informar y proporcionar repro. Como descubrió, el error solo reproducirá en los escenarios de composición donde el padre ha sido modificado además de uno o más hijos . La solución consiste en hacer unAcceptChanges explícito si el envío fue exitoso. Por ejemplo, aquí es el código que iba a escribir en una devolución de llamada presentar:

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

Esto aceptar todos los cambios y restablecer cambian de estado correctamente.

+0

hey ¿Qué es "ctxt" en la solución de su respuesta? Probablemente estoy enfrentando el mismo problema. Gracias –

Cuestiones relacionadas