繁体   English   中英

先在实体框架model中关闭跟踪

[英]Turn off tracking in entity framework model first

我想接收一个实体然后更新它,但我想在没有跟踪的情况下获取它,所以我可以将它附加回上下文。

我引用了EntityFramework.dll (4.1)。 我从 model 生成了数据库。 (不是代码优先)。

获取用户:

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 中已存在具有相同密钥的 object。 ObjectStateManager 无法跟踪具有相同键的多个对象。

我这样调用方法:

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM