私は通常、コレクションをエンティティで直接変更するのではなく、自分でコレクションを処理したため、これまでこれに遭遇したことはありません。
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 エンティティを読み込んで変更を試みましたが、エンティティ フレームワークで (Instructors コレクションで) PK エラーが発生することがあります。同じキーを持つエンティティを追加しようとしているかのようです。そのため、代わりに Schedule エンティティ (ID を含む) を手動で再構築してから更新しています。これを行うと、エラーは発生しなくなりますが、Instructors コレクションは変更されません。私はCurrentValuesのために考えています。SetValues は、更新されたバージョンではなく、永続化されたエンティティに基づいて適用されています。更新を別の方法で処理する必要がありますか、それとも手動で行う必要がありますか