web-dev-qa-db-ja.com

Entry <TEntity>()。CurrentValues.SetValues()を使用してもコレクションが更新されない

エンティティで直接コレクションを変更するのではなく、通常はコレクションを自分で処理するため、これに遭遇したことはありません。

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

22
DDiVita

SetValuesはナビゲーションプロパティを更新しません。コードを実行すると、Updateメソッドに渡されたエンティティのシンプル/複雑なプロパティの変更についてのみ認識されます。 EFは、Updateメソッドに渡されたエンティティの関連エンティティについてさえ知りません。

オブジェクトグラフの各変更についてEFに手動で通知する必要があります-EFには オブジェクトグラフの解決メカニズム がありません。

33
Ladislav Mrnka