【发布时间】:2011-10-23 12:51:52
【问题描述】:
我想接收一个实体然后更新它,但我想在不跟踪的情况下获取它,所以我可以将它附加回上下文。
我引用了EntityFramework.dll (4.1)。我从模型生成了数据库。 (不是代码优先)。
获取用户:
db.Users.MergeOption = MergeOption.NoTracking;
IQueryable<User> query = db.Users;//.AsNoTracking(); //<-- apparently, this is code-first only.
return query;
更新用户:
db.Users.Attach(user); //error here.
ObjectStateEntry entry = db.ObjectStateManager.GetObjectStateEntry(user);
entry.SetModifiedProperty(propertyName);
db.SaveChanges();
return user;
错误:
ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象。
我这样调用方法:
var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId);
user.Identifiers.Add(someIdent);
userRepository.UpdateUser(user);
【问题讨论】:
-
它应该可以工作。您确定您没有收到用户的其他查询吗?
-
@Ladislav 相同的查询。我在存储库中只有 1 个读取/获取方法,它使用该代码
-
我刚刚测试了类似的代码,没有任何存储库负担,它对我有用。
-
这看起来不是问题,但我不明白你为什么要使用
NoTracking,如果你要再次将它附加回相同的上下文并保存它。NoTracking适用于您不想更改实体的场景。 -
user.Identifiers.Add(someIdent);中的标识符是什么,这也是一个实体吗?如果是这样,那可能是导致“相同的密钥已经存在”错误的原因吗?
标签: c# .net entity-framework