首先关闭实体框架模型中的跟踪
本文关键字:模型 跟踪 框架 实体 | 更新日期: 2023-09-27 18:05:05
我试图接收一个实体,然后更新它,但我想让它没有跟踪,所以我可以把它附加回上下文。
我引用了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中已经存在具有相同key的对象。ObjectStateManager不能跟踪具有相同key的多个对象。
我这样调用这个方法:
var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId);
user.Identifiers.Add(someIdent);
userRepository.UpdateUser(user);
无跟踪查询有时,您可能希望查询实体,但不希望上下文跟踪实体。在只读场景中查询大量实体时,这可能会带来更好的性能。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();
而不是分离和附加。如果要处理更新可能来自或不来自原始上下文的项,可以执行以下操作。
var originalItem = db.Users.Find(user.UserId);
db.Entry(originalItem).CurrentValues.SetValues(user);
db.SaveChanges();