25

我以前没有遇到过这种情况,因为我通常由他们自己处理集合,而不是直接在实体上修改它们。

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 是基于持久化实体而不是我的更新版本应用的。我应该以不同的方式处理我的更新还是我需要手动

4

1 回答 1

34

SetValues从不更新导航属性。当您执行代码时,它只知道传递给您的Update方法的实体的简单/复杂属性的变化。EF 甚至不知道传递给您的Update方法的实体的相关实体。

您必须手动告诉 EF 您的对象图中的每个更改 - EF 没有对象图的任何解析机制

于 2012-07-29T16:18:50.290 回答