Я не сталкивался с этим раньше, потому что я обычно обрабатывал коллекции сами, вместо того, чтобы изменять их непосредственно на сущности.
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);
}
Если я изменю коллекцию инструкторов, попробуйте применить обновление, оно, похоже, сохранит мои исходные значения. Я попытался загрузить объект "Расписание" до обновления и внести изменения, но иногда это вызывает ошибку PK (в коллекции инструкторов) в инфраструктуре сущности. Как будто он пытается добавить объект с тем же ключом. Поэтому вместо этого я восстанавливаю объект Schedule (включая идентификатор) вручную, а затем обновляю его. Однако, когда я делаю это, я не получаю больше ошибок, коллекции инструкторов не меняются. Я думаю, потому что CurrentValues. SetValues применяется на основе сохраняемого объекта, а не моей обновленной версии. Должен ли я обрабатывать свои обновления по-другому или мне нужно manully