2010-05-24 6 views
5

Tôi có một mô hình máy chủ rất đơn giản bao gồm một thực thể cha với một danh sách [Thành phần] của các thực thể con. Trong khách hàng của tôi, tôi có 2 chức năng. Một hàm loại bỏ tất cả các thực thể con từ cha và người kia loại bỏ tất cả và cũng chỉnh sửa thuộc tính trên thực thể cha.DomainContext đôi khi vẫn HasChanges sau khi SubmitChanges hoàn thành

Khi tôi chỉ xóa tất cả các thực thể con và SubmitChanges(), tất cả đều tốt.

Khi tôi xóa tất cả các thực thể con chỉnh sửa phụ huynh và SubmitChanges(), vẫn còn các thay đổi đang chờ xử lý (HasChanges == true) khi cuộc gọi lại SubmitChanges() được kích hoạt.

Tôi đang sử dụng Silverlight 4 RTM và RIA Services 1.0 RTM.

Bất kỳ ý tưởng gì đang diễn ra ở đây?

Dưới đây là các đối tượng máy chủ:

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

Và đây là mã khách hàng:

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

Khi bạn chạy mã này ChildWindow chỉ hiển thị khi bạn ClearCitiesEditRegion() phương pháp được gọi là . Sự khác biệt duy nhất giữa phương thức này và phương thức ClearCities() là dòng mà tôi chỉnh sửa thuộc tính region.Name.

Bạn cũng có thể tải về một dự án mẫu mà tái tạo này ở đây: http://dl.dropbox.com/u/2393192/RIA_Services_Problem.zip

Trả lời

4

tôi nhận được một câu trả lời cho điều này trên các diễn đàn Silverlight. Rõ ràng đây là một lỗi trong RIA Service 1.0. Sau đây là Matthew's response on the Silverlight forums.

Có, tôi đã xác nhận đây là lỗi. Cảm ơn bạn đã báo cáo và cung cấp bản kiểm tra. Khi bạn phát hiện ra, lỗi sẽ chỉ repro trong bố cục trường hợp mà phụ huynh đã được sửa đổi ngoài một hoặc nhiều số trẻ em. Giải pháp thay thế là thực hiện AcceptChanges rõ ràng nếu gửi thành công. Ví dụ, đây là mã bạn muốn viết trong một trình callback:

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

này sẽ chấp nhận tất cả các thay đổi và thiết lập lại thay đổi trạng thái một cách chính xác.

+0

hey "ctxt" trong câu trả lời giải pháp của anh ấy là gì? Tôi có lẽ đang phải đối mặt với cùng một vấn đề. Cảm ơn –