2011-08-09 56 views
23

我正在尝试接收实体并更新它,但我希望在没有跟踪的情况下获取它,以便我可以将其重新附加到上下文中。首先关闭实体框架模型中的跟踪

我有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; 

错误:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

我把这样的方法:

var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId); 
user.Identifiers.Add(someIdent); 
userRepository.UpdateUser(user); 
+0

它应该工作。你确定你没有收到另一个查询的用户吗? –

+0

@Ladislav相同的查询。我在版本库中只有1个读取/获取方法,它使用该代码 –

+0

我刚刚测试了类似的代码,没有所有的存储库负担,它适用于我。 –

回答

7

而不是分离和附着。如果您想要处理更新可能来自或不可能来自原始上下文的项目,则可以执行以下操作。

var originalItem = db.Users.Find(user.UserId); 
db.Entry(originalItem).CurrentValues.SetValues(user); 
db.SaveChanges(); 
+3

当我的对象(originalItem)有一个属性是子实体的集合时,这似乎不适用于我。我需要为这种情况做些特别的事情吗? –

17

无跟踪查询 有时你可能想查询实体,但没有实体上下文进行跟踪。当在只读场景中查询大量实体时,这可能会导致更好的性能。 AsNoTracking扩展方法执行查询并返回结果,而不在上下文中跟踪它们。在以下示例中,查询将返回对象,但不会被上下文跟踪。 其他

 // Query for all departments without tracking them 
     var departments1 = context.Departments.AsNoTracking().ToList(); 

     // Query for some departments without tracking them 
     var departments2 = context.Departments 
       .Where(d => d.Name.StartsWith("math")) 
       .AsNoTracking() 
       .ToList(); 
+0

引用来源:https://msdn.microsoft.com/en-us/data/jj556203.aspx –