2012-07-28 31 views
19

我之前沒有遇到過這種情況,因爲我通常通過它們自己處理集合,而不是直接在實體上修改它們。使用條目<TEntity>().CurrentValues.SetValues()沒有更新集合

public class Schedule: BaseEntity 
     { 
      public Guid Id {get;set;} 
      public virtual int? DayOfTheWeekTypeId { get; set; } 
      public virtual DayOfTheWeekType DayOfTheWeekType { get; set; } 
      public virtual ICollection<Instructor> Instructors { get; set; } 
      public DateTime? StartDateTime { get; set; } 
      public DateTime? EndDateTime { get; set; } 
      public string SpecialInstructions { get; set; } 
     } 

映射類:

public ScheduleMapping() 
      { 
       HasMany(c => c.Instructors).WithMany().Map(m => { m.MapLeftKey("ScheduleId"); 
m.MapRightKey("InstructorId"); 
m.ToTable("Schedule_Instructors"); 
       }); 
       HasOptional(s => s.DayOfTheWeekType).WithMany().HasForeignKey(s => s.DayOfTheWeekTypeId).WillCascadeOnDelete(false); 
       Property(s => s.SpecialInstructions).IsMaxLength(); 
      } 

這是我的更新方法:

public virtual void Update(TEntity entity) 
     { 
      if (entity == null) 
       throw new ArgumentNullException("entity"); 
      //this is the original persisted entity 
      var persistedEntity = _repository.GetById(entity.Id); 
      if(originalEntity != null) 
      { 
       entity.Id = persistedEntity.Id;     
       UnitOfWork.ApplyCurrentValues<TEntity>(originalEntity,entity); 
       UnitOfWork.Commit(); 
      } 
     } 

這是處理的 「合併」

public void ApplyCurrentValues<TEntity>(TEntity original, TEntity current) where TEntity : class 
     { 
      base.Entry<TEntity>(original).CurrentValues.SetValues(current); 
     } 

如果我修改方法Instructors集合然後嘗試應用th e更新,似乎保持了我原來的價值。我曾嘗試在更新之前加載Schedule實體並進行更改,但有時會在實體框架中導致PK錯誤(在Instructors集合上)。就好像它試圖添加具有相同密鑰的實體一樣。因此,我正在手動重建計劃實體(包括ID)並更新它。當我這樣做時,我不會再有任何錯誤,但是,教師集合不會改變。我在想,因爲CurrentValues。 SetValues基於持久化實體而不是我的更新版本進行應用。應該不同地處理我的更新,還是需要手工處理

回答

26

SetValues從不更新導航屬性。當你執行你的代碼時,它只知道傳遞給你方法的實體的簡單/複雜屬性的變化。 EF甚至不知道傳遞給您的實體的相關實體的方法Update

您必須手動告知EF您的對象圖中的每個更改 - EF沒有任何resolution mechanism for object graphs

+0

你是如此的正確和意識到我已經忘記了這一點。回顧一下我在初次學習EF時遇到過的一些老例子,很久以前我就知道了這一點。我已經恢復爲手動更新個人收藏。現在直到EF自動處理它纔有意義。謝謝拉迪斯拉夫 – DDiVita 2012-07-29 23:41:03

+1

但它很高興地更新導航屬性的匹配'ID',這個答案讓我走錯了軌道。事實證明,我的實際問題是已經在分離的實體中設置了id,這意味着'SetValues'認爲它沒有改變,所以沒有翻轉'IsModified'位,這意味着該值沒有被持久化'的SaveChanges()'。 – 2016-06-03 11:02:50