2012-07-28 18 views
19

koleksiyonlarını güncelleyerek değildir., bunu daha önce çalıştırmak değil

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

Haritalama sınıfı: Bu benim değiştirirseniz

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

"birleştirme" ele Yöntem olduğunu

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

Bu benim güncelleme yöntemidir Eğitmenler koleksiyonu daha sonra e güncelleme, orijinal değerlerimi koruyor gibi görünüyor. Güncellemeden önce Zamanlama varlığını yüklemeyi denedim ve değişikliklerimi yapmam gerekiyor, ancak bazen bu durum, varlık çerçevesindeki bir PK hatası (Eğitmenler koleksiyonunda) neden oluyor. Aynı anahtara sahip bir varlık eklemeye çalışıyormuş gibi. Bu yüzden, bunun yerine Program kimliğini (ID dahil) yeniden oluşturuyorum ve sonra güncelliyorum. Bunu yaptığımda daha fazla hata alamıyorum, ancak Eğitmen koleksiyonları değişmez. Düşünüyorum çünkü CurrentValues. SetValues, güncellenmiş sürümüm değil, kalıcı varlığa dayalı olarak uygulanıyor. Güncelleştirmelerimi farklı şekilde ele almalı mıyım yoksa manully

cevap

26

SetValues hiçbir zaman gezinme özelliklerini güncellemem gerek. Kodunuzu çalıştırdığınızda, yalnızca Update yönteminize iletilen varlığın basit/karmaşık özelliklerinde yapılan değişiklikleri bilir. EF bile, Update yönteminize geçirilen varlığın ilgili varlıkları hakkında bilgi sahibi değildir.

Nesne grafiğinizdeki her değişiklik hakkında EF'yi manuel olarak bildirmeniz gerekir; EF'de resolution mechanism for object graphs yoktur.

+0

Bu konuda çok üzüldüm ve unutmuştum. Eski bazı örneklere baktığımda EF ilk öğrenirken POC'm vardı, bunu uzun zaman önce anladım. Tek tek koleksiyonları manuel olarak güncellemeye geri döndüm. EF, otomatik olarak ele geçirinceye kadar şu anda mantıklı geliyor. Teşekkürler Ladislav – DDiVita

+1

Ancak, bir navigasyon özelliği için eşleşen bir 'ID' güncellemesi yapar ve bu cevap beni yanlış yolda bıraktı. Benim asıl problemim, zaten ayarlanmış olan ID'de ayarlanmış olan ID ile ilgili yapmaktır. Yani 'SetValues' değişmediğini düşündü, bu yüzden 'IsModified' bitini çevirmedi, ki bu da değerin kalıcı olmadığı anlamına geliyordu. 'SaveChanges() '. –