我以前没有遇到过这种情况,因为我通常由他们自己处理集合,而不是直接在实体上修改它们。
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 集合然后尝试应用更新,它似乎保留了我的原始值。我曾尝试在更新之前加载 Schedule 实体并进行更改,但有时这会导致实体框架中的 PK 错误(在 Instructors 集合上)。好像它正在尝试添加具有相同键的实体。因此,我改为手动重建 Schedule 实体(包括 ID),然后对其进行更新。但是,当我这样做时,我不会再收到任何错误,Instructors 集合不会改变。我在想是因为 CurrentValues。SetValues 是基于持久化实体而不是我的更新版本应用的。我应该以不同的方式处理我的更新还是我需要手动