Entity framework 使用条目<;张力>;().CurrentValues.SetValues()未更新集合

Entity framework 使用条目<;张力>;().CurrentValues.SetValues()未更新集合,entity-framework,entity-framework-4.1,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 { g

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

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 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();
            }
        }
公共虚拟无效更新(TEntity实体)
{
if(实体==null)
抛出新的ArgumentNullException(“实体”);
//这是原始的持久化实体
var persistedEntity=_repository.GetById(entity.Id);
if(原始属性!=null)
{
entity.Id=persistedEntity.Id;
应用当前值(原始属性、实体);
UnitOfWork.Commit();
}
}
这是处理“合并”的方法

public void ApplyCurrentValues(tenty-original,tenty-current),其中tenty:class
{
base.Entry(原始).CurrentValues.SetValues(当前);
}

如果我修改了Instructors集合,然后尝试应用更新,它似乎保留了我的原始值。我尝试在更新之前加载Schedule实体并进行更改,但有时会导致实体框架中出现PK错误(在Instructors集合上)。就像它试图添加具有相同密钥的实体一样。因此,我将手动重建计划实体(包括ID),然后更新它。当我这样做时,我不会再收到任何错误,但是,讲师集合不会改变。我在思考,因为我的价值观。SetValues是基于持久化实体而不是我的更新版本应用的。我应该以不同的方式处理更新,还是需要手动设置值

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


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

您是如此正确,并且意识到我忘记了这一点。看看我第一次学习EF时使用的一些老例子,我早就发现了这一点。我已恢复手动更新单个集合。在EF自动处理之前,它现在是有意义的。感谢LadislavIt,不过它很乐意为导航属性更新匹配的
ID
,这个答案让我走错了方向。事实证明,我的实际问题与已在分离实体中设置的id有关,这意味着
SetValues
认为它没有更改,所以没有翻转
IsModified
位,这反过来意味着值没有在
SaveChanges()
@TimAbell()上持久化。我遇到了相同的情况
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);
        }