2009-11-08 29 views
7

Tôi đang sử dụng cơ sở dữ liệu Northwind làm ví dụ cho bài đăng này, nơi tôi đang gặp sự cố khi lưu các thực thể tách rời về cơ sở dữ liệu bằng khung thực thể.Entity Framework - Lưu thay đổi đối với các đối tượng liên quan ở trạng thái tách rời

Tôi có hai phương pháp sau đây để làm cho tôi các vùng lãnh thổ và các vùng:

static List<Region> GetRegions() 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Region.MergeOption = System.Data.Objects.MergeOption.NoTracking; 
      return entities.Region.ToList(); 
     } 
    } 

    static List<Territories> GetTerritories() 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Territories.MergeOption = System.Data.Objects.MergeOption.NoTracking; 
      return entities.Territories.ToList(); 
     } 
    } 

Những phương pháp này đều làm việc tốt và làm cho tôi bộ sưu tập của các đối tượng tôi yêu cầu trong tình trạng tách ra.

Tôi cũng có một phương pháp tĩnh gọi SaveEntity, trong đó có cả một tổ chức cũ và các thực thể hiện ngồi biên tập, điều này được như sau:

static void SaveEntity(EntityObject oldEntity, EntityObject newEntity) 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Attach(oldEntity); 
      entities.ApplyPropertyChanges(newEntity.EntityKey.EntitySetName, newEntity); 
      entities.SaveChanges(); 
     } 
    } 

Phương pháp này một phần hoạt động, nơi các thay đổi đối với đối tượng được lưu xuống cơ sở dữ liệu, nhưng mọi thay đổi đối với mối quan hệ của các đối tượng liên quan đều không được lưu.

Tôi đã đoạn mã sau gọi các phương pháp trên là ví dụ của tôi:

  List<Territories> territories = GetTerritories(); 
     List<Region> regions = GetRegions(); 

     Region region = regions.Where(n => n.RegionID == 2).FirstOrDefault(); 
     Territories oldTerritory = territories.Where(n => n.TerritoryID == "01581").FirstOrDefault(); 
     Territories newTerritory = ObjectCopier.Clone<Territories>(oldTerritory); 

     newTerritory.TerritoryDescription = "Hello World"; 
     newTerritory.Region = region; 

     SaveEntity(oldTerritory, newTerritory); 

Sự thay đổi để TerritoryDescription được lưu thành công, nhưng sự thay đổi đến khu vực không phải là, trong cơ sở dữ liệu nó vẫn như regionId = 1 thay vì RegionID = 2.

Có ai có thể cung cấp cho tôi một số thông tin chi tiết về lý do tại sao ApplyPropertyChanges không đẩy các thay đổi đối với các đối tượng liên quan không?

Ngoài ra, có ai biết cách tôi có thể khắc phục sự cố này không?

Trả lời

1

Tôi nghĩ bạn có thể tìm thấy câu trả lời ở đây (Alex James tốt hơn). Entity Framework Updating with Related Entity

Về cơ bản, lý do là vì trong các mối quan hệ EF cũng là các đối tượng và có trạng thái như thực thể (đã xóa, thêm, ...), vì vậy bạn cần có giá trị tham chiếu gốc trong ngữ cảnh.

2

Thay vì tìm nạp vùng và lãnh thổ một cách riêng biệt, hãy tìm nạp cả hai vùng trong cùng một truy vấn. Một cái gì đó như (Tôi giả sử bạn muốn cập nhật thực thể, không muốn tạo một thực thể mới);

static List<Region> GetTerritoriesWithRegions() 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Territories.MergeOption = System.Data.Objects.MergeOption.NoTracking; 
      return entities.Territories.Include("Region").ToList(); 
     } 
    } 

Sau đó cập nhật chúng như sau;

List<Territories> territoriesWithRegions = GetTerritoriesWithRegions(); 
     Territories territory = territories.Where(n => n.TerritoryID == "01581").FirstOrDefault(); 
     territory.TerritoryDescription = "Hello World"; 
     Region region = territories.Where(p => p.Any(q => q.Region.RegionID == 2)).FirstOrDefault().Region; 
     territory.Region = region; 

     SaveEntity(territory); 

Và lưu chúng;

static void SaveEntity(EntityObject entity) 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Attach(entity); 
      entities.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);    
      entities.SaveChanges(); 
     } 
    } 

Tôi đã mã hóa điều này trên notepad để có thể có lỗi; nếu có xin vui lòng bình luận vì vậy tôi sẽ cập nhật cho phù hợp.

Các vấn đề liên quan