2012-07-28 4 views
19

Non l'ho mai incontrato prima, perché di solito gestivo le raccolte da loro stessi invece di modificarle direttamente sull'entità. ClasseUtilizzo della voce <TEntity>() .CurrentValues.SetValues ​​() non sta aggiornando le raccolte

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

Mapping:

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

Questo è il mio metodo di aggiornamento:

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

questo è il metodo che ha gestito la "merge"

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

Se modifico la collezione Istruttori quindi tenta di applicare th e aggiornamento, sembra mantenere i miei valori originali. Ho provato a caricare l'entità di pianificazione prima dell'aggiornamento e apportare le mie modifiche, ma a volte ciò causa un errore PK (nella raccolta Istruttori) nel framework di entità. Come se stesse cercando di aggiungere un'entità con la stessa chiave. Quindi, invece, sto ricostruendo manualmente l'entità di pianificazione (incluso l'ID) e quindi aggiornandola. Quando lo faccio non ottengo più errori, tuttavia, le raccolte degli istruttori non cambiano. Sto pensando perché CurrentValues. SetValues ​​viene applicato in base all'entità persistente e non alla mia versione aggiornata. Devo gestire i miei aggiornamenti in modo diverso o devo manully

risposta

26

SetValues non aggiorna mai le proprietà di navigazione. Quando si esegue il codice, esso conosce solo le modifiche delle proprietà semplici/complesse dell'entità passate al metodo Update. EF non sa nemmeno delle entità correlate dell'entità passate al tuo metodo Update.

È necessario comunicare manualmente EF su ogni modifica nel grafico dell'oggetto - EF non ha alcun resolution mechanism for object graphs.

+0

Sei così corretto e mi sono reso conto di questo. Guardando alcuni vecchi esempi che ho avuto POCed quando ho iniziato a studiare EF, l'avevo capito molto tempo fa. Sono tornato ad aggiornare manualmente le singole raccolte. Ha senso in questo momento finché EF non lo gestisce automaticamente. Grazie Ladislav – DDiVita

+1

Aggiorna comunque un ID 'di corrispondenza per una proprietà di navigazione, e questa risposta mi ha mandato sulla traccia sbagliata. Risulta che il mio vero problema riguardava già l'id che si trova nell'entità distaccata, il che significa che SetValues ​​pensava che fosse invariato, quindi non capovolgi il bit 'IsModified', che a sua volta significava che il valore non era persistente 'SaveChanges()'. –

Problemi correlati