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);
            }
        }
Пример #2
0
        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");
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
 public void SetPolicy(DataConflictPolicy policy)
 {
     base.policy = policy;
 }
Пример #5
0
 public BaseService(IDbContext context)
 {
     this.context = context;
     this.policy  = DataConflictPolicy.ClientWins;
 }