Подтвердить что ты не робот

Использование 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);
        }

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

4b9b3361

Ответ 1

SetValues никогда не обновляет свойства навигации. Когда вы выполняете свой код, он знает только об изменениях в простых/сложных свойствах объекта, переданных вашему методу Update. EF даже не знает о связанных объектах объекта, переданных вашему методу Update.

Вы должны вручную указать EF о каждом изменении в вашем графе объектов - EF не имеет механизма разрешения для графиков объектов.