public void UpdateWithLog(T entity, Guid creatorGuid) { dbContext.Entry(entity).State = EntityState.Modified; //dbContext.Set<T>().Attach(entity); //dbContext.Entry(entity).State = EntityState.Modified; dbContext.Set<ModelLog>().Add(GetModelLog(entity, creatorGuid, "Update")); }
如上方法报错:
具体操作过程:
Find----序列化-----反序列化-----修改model值----update
求助,该如何写EF的Update方法。
http://blogs.msdn.com/b/cesardelatorre/archive/2008/09/04/updating-data-using-entity-framework-in-n-tier-and-n-layer-applications-short-lived-ef-contexts.aspx
请仔细看清楚我在说什么。
@快乐鸟: 那我只能呵呵了
你为何要去碰EF的底层更新方法呢?每个实体从EF的DBContext后会被生成一个动态代理,实体的自身属性的改变是被跟踪(StateTracking)的,你将实体查出来直接对某个属性赋值后调用DbContext.SaveChanges() 后EF会自动保存了。
你上面错误是由于你的实体是从另一个DBContext实例中取出,而在另一个DBContext实例上Attach所以导致更新冲突的,如果一定要这样写的话,可能这样可以有些帮助。
var modifiedEntity = dbContext.Entry(entity);
dbContext.Set<ModelLog>.Attach(modifiedEntity);
modifiedEntity.State = EntityState.Modified;
dbContext.SaveChanges();
你原有的代码已经使用Attach挂上了实体的状态,而你又调用Add,这当然是出问题了。