首先关闭实体框架模型中的跟踪

Sha*_*ean 23 .net c# entity-framework

我想接收一个实体,然后更新它,但我希望得到它没有跟踪,所以我可以将它附加回上下文.

我有EntityFramework.dll引用(4.1).我从模型中生成了数据库.(不是代码优先).

获取用户:

db.Users.MergeOption = MergeOption.NoTracking;
IQueryable<User> query = db.Users;//.AsNoTracking(); //<-- apparently, this is code-first only.

return query;
Run Code Online (Sandbox Code Playgroud)

更新用户:

db.Users.Attach(user); //error here.
ObjectStateEntry entry = db.ObjectStateManager.GetObjectStateEntry(user);
entry.SetModifiedProperty(propertyName);
db.SaveChanges();
return user;
Run Code Online (Sandbox Code Playgroud)

错误:

ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象.

我这样称呼方法:

var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId);
user.Identifiers.Add(someIdent);
userRepository.UpdateUser(user);
Run Code Online (Sandbox Code Playgroud)

小智 18

无跟踪查询有时,您可能希望查询实体,但不能通过上下文跟踪实体.在只读方案中查询大量实体时,这可能会带来更好的性能.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();
Run Code Online (Sandbox Code Playgroud)


Jos*_*osh 7

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

var originalItem = db.Users.Find(user.UserId);
db.Entry(originalItem).CurrentValues.SetValues(user);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

  • 当我的对象(originalItem)具有属于子实体集合的属性时,这似乎对我不起作用.对于这种情况,我需要做些什么特别的事吗? (3认同)