entity-framework - 使用 Entry<TEntity>().CurrentValues.SetValues() 不会更新集合

标签 entity-framework entity-framework-4.1

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

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 实体并进行更改,但有时这会导致 Entity Framework 中的 PK 错误(在 Instructors 集合上)。好像它正在尝试添加具有相同键的实体。因此,我正在手动重建 Schedule 实体(包括 ID),然后对其进行更新。当我这样做时,我不会再收到任何错误,但是,Instructors 集合不会改变。我在想,因为 CurrentValues。 SetValues 是基于持久化实体而不是我的更新版本应用的。我应该以不同的方式处理我的更新还是需要手动处理

最佳答案

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

您必须手动将对象图中的每个更改告诉 EF - EF 没有任何 resolution mechanism for object graphs .

关于entity-framework - 使用 Entry<TEntity>().CurrentValues.SetValues() 不会更新集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11705569/

相关文章:

c# - 为什么 Entity Framework 代码首先更改我的类型名称?

c# - SQL 到 LINQ 转换器

c# - 控制创建 Entity Framework ObjectContext 的频率

sql-server - 在 Entity Framework 4.1 Code First 中手动生成主键的最佳方法是什么

c# - IEnumerable.Single 引发异常

wpf - Entity Framework - 将导航属性绑定(bind)到 ListBox

entity-framework - Entity Framework : How to exclude deleted objects from Queries

sql-server - 将 SQL Server 的 CONTAINS() 导入为模型定义的函数

c# - 如何检测 Entity Framework Core 2.x 中特定实体的属性更改?

c# - Entity Framework Core - 迁移 - 没有为此对象定义无参数构造函数