开发者

Turn off tracking in entity framework model first

开发者 https://www.devze.com 2023-03-27 00:42 出处:网络
I\'m tring to receive an entity and then update it, but I want to get it with no tracking, so I can attach it back to the context.

I'm tring to receive an entity and then update it, but I want to get it with no tracking, so I can attach it back to the context.

I have the EntityFramework.dll referenced (4.1). I generated the database from the model. (not code-first).

Get user:

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

return query;

Update user:

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

Error:

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

I call the method like this:

var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId);
user.Identifiers.Ad开发者_StackOverflowd(someIdent);
userRepository.UpdateUser(user);


No-tracking Queries Sometimes you may want to query for entities but not have the entities be tracked by the context. This may result in better performance when querying for large numbers of entities in read-only scenarios. The AsNoTracking extension method executes a query and returns the results without tracking them in the context. In the following example, the queries will return objects but they will not be tracked by the context. other

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


Instead of detaching and attaching. If you want to handle Updating an item that may or may not be from the original context, you could do the following.

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

精彩评论

暂无评论...
验证码 换一张
取 消