S3ddi9
S3ddi9

Reputation: 2151

SaveChanges vs. AcceptAllChanges in Entity Framework

What's the difference between, _context.SaveChanges and _context.AcceptAllChanges(), is the AcceptAllChanges() is sort of reloading data from Database or rolling back (discarding) changes made by the user when he didn't use SaveChanges()

Upvotes: 25

Views: 23873

Answers (2)

Diego
Diego

Reputation: 36166

From the Accessing Data with Microsoft .Net Framework 4 book:

When working with the Entity Framework, the submission of changes to the database is automatically handled within a transaction when you call the SaveChanges method on the ObjectContext object. Also, the AcceptAllChanges method is automatically called if no exception is thrown when updating, which will reset the state of all objects to Unchanged. Although the SaveChanges method is executed within a transaction, you might need to create your own transaction if you need to perform other operations within the same transaction

Upvotes: 3

Habib
Habib

Reputation: 223372

ObjectContext.AcceptAllChanges Method - MSDN

If the SaveChanges method was called and the AcceptAllChangesAfterSave was not specified, the user must call the AcceptAllChanges method. The AcceptAllChanges method is useful in the scenario where a transaction has failed and a user wants to retry.

You may see this: http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx

If you call SaveChanges() or SaveChanges(true),the EF simply assumes that if its work completes okay, everything is okay, so it will discard the changes it has been tracking, and wait for new changes.

Unfortunately though if something goes wrong somewhere else in the transaction, because the EF discarded the changes it was tracking, we can’t recover.

This is where SaveChanges(false) and AcceptAllChanges() come in.

SaveChanges(false) tells the EF to execute the necessary database commands, but hold on to the changes, so they can be replayed if necessary.

Now if the broader transaction fails you can retry the EF specific bits, with another call to SaveChanges(false). Alternatively you can walk through the state-manager to log what failed.

Once the broader transaction succeeds, you simply call AcceptAllChanges() manually, and the changes that were being tracked are discarded.

Upvotes: 31

Related Questions