Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get List of Modified Objects within Entity Framework 7

I am stumped - upgrading to Entity Framework 7 and I typically override the SaveChanges inside the DbContext to be able to get a list of all the Modified Objects before it changes. Ultimately I have a script that fires that tracks the previous version in a database. In Entity Framework 6 I would get the model changes like so:

var oc = ((IObjectContextAdapter)this).ObjectContext;
var modifiedItems = oc.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted);

List<ObjectStateEntry> ModifiedObjlist = modifiedItems.ToList();

However now that ObjectContext is removed within Entity Framework 7, I am stuck, how would I inside Entity Framework 7 get a list of the modified objects?

like image 843
kevin c Avatar asked Sep 15 '15 19:09

kevin c


2 Answers

You can use DbContext.ChangeTracker

var modifiedEntries = context.ChangeTracker
       .Entries()
       .Where(x => x.State == EntityState.Modified)
       .Select(x =>x.Entity)
       .ToList();
like image 117
Hamid Pourjam Avatar answered Oct 21 '22 06:10

Hamid Pourjam


@dotctor 's code may not work in some cases.

There are certain instances where the change tracker may not have the latest information with regards to the entities being managed by the context, so an entity could be modified/added/deleted without the change tracker being aware. To avoid this case, I would wrap the @dotctor 's code in the following conditional:

if(context.ChangeTracker.HasChanges())
{
  ...
}


Microsoft Summary of ChangeTracker.HasChanges():

Checks if any new, deleted, or changed entities are being tracked such that these changes will be sent to the database if DbContext.SaveChanges or DbContext.SaveChangesAsync is called. Note that this method calls ChangeTracker.DetectChanges unless ChangeTracker.AutoDetectChangesEnabled has been set to false.

like image 23
John Avatar answered Oct 21 '22 06:10

John