 <p>If <code>SaveChanges</code> fails, then you will need to rollback your entity's values back to what they originally were.</p> <p>In your <code>DbContext</code> class, you can add a method called <code>Rollback</code>, it'll look something like this:</p> <pre><code>public class MyDbContext : DbContext { //DataSets and what not. //... public void Rollback() { //Get all entities var entries = this.ChangeTracker.Entries().ToList(); var changed = entries.Where(x =&gt; x.State != EntityState.Unchanged).ToList(); var modified = changed.Where(x =&gt; x.State == EntityState.Modified).ToList(); var added = changed.Where(x =&gt; x.State == EntityState.Added).ToList(); var deleted = changed.Where(x =&gt; x.State == EntityState.Deleted).ToList(); //Reset values for modified entries foreach (var entry in modified) { entry.CurrentValues.SetValues(entry.OriginalValues); entry.State = EntityState.Unchanged; } //Remove any added entries foreach (var entry in added) entry.State = EntityState.Detached; //Undo any deleted entries foreach (var entry in deleted) entry.State = EntityState.Unchanged; } } </code></pre> <p>You can simply call this method in your <code>catch</code>:</p> <pre><code>try { dataEntities.SaveChanges(); } catch (Exception oops) { //Rollback all changes dataEntities.Rollback(); } </code></pre> <p>Note that <code>INotifyPropertyChanged</code> will need to be implemented on properties that are bound to the view, this will ensure that any changes that the rollback performs will be pushed back to the view.</p>