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);
}