public static DataConflictInfo ApplyPolicy(DataConflictPolicy policy, DbUpdateConcurrencyException exception) { DbEntityEntry entry = exception.Entries.Single(); switch (policy) { case DataConflictPolicy.DatabaseWins: // Update the values of the entity that failed to save from the store entry.Reload(); return(null); case DataConflictPolicy.ClientWins: // Update original values from the database entry.OriginalValues.SetValues(entry.GetDatabaseValues()); return(null); case DataConflictPolicy.AskClient: // Get the current entity values and the values in the database var currentValues = entry.CurrentValues; var databaseValues = entry.GetDatabaseValues().Clone(); return(new DataConflictInfo { CurrentValues = currentValues, DatabaseValues = databaseValues }); default: return(null); } }
public void Validate(int expectedObjectsCount, DataConflictPolicy dataConflictPolicy) { if (dataConflictPolicy == DataConflictPolicy.DatabaseWins && (this.AlteredObjectsCount != 0 || this.AlteredIds.Count() != expectedObjectsCount)) { throw new DalException(DalErrorType.SaveResultPersistenceValidationFailure, "Persistence validation failure"); } if (dataConflictPolicy == DataConflictPolicy.ClientWins && (this.AlteredObjectsCount != expectedObjectsCount || this.AlteredIds.Count() != expectedObjectsCount)) { throw new DalException(DalErrorType.SaveResultPersistenceValidationFailure, "Persistence validation failure"); } }
protected async Task <SaveResult> SaveAsync(DataConflictPolicy policy) { bool saveFailed; do { saveFailed = false; try { int result = await this.context.SaveChangesAsync(); return(new SaveResult { AlteredObjectsCount = result }); } catch (DbUpdateConcurrencyException exception) { if (policy == DataConflictPolicy.NoPolicy) { throw new DalException(DalErrorType.BaseServiceDataConflictWithNoPolicy, "Data conflict (Optimistic concurrency)"); } saveFailed = true; DataConflictInfo info = OptimisticConcurrency.ApplyPolicy(policy, exception); if (info != null) { throw new DataConflictException(DalErrorType.BaseServiceDataConflictWithAskClientPolicy, info); } } catch (Exception exception) { exception.HandleException(); } } while (saveFailed); return(null); }
public void SetPolicy(DataConflictPolicy policy) { base.policy = policy; }
public BaseService(IDbContext context) { this.context = context; this.policy = DataConflictPolicy.ClientWins; }