/// <summary> /// Throws an exception indicating that concurrency conflicts were detected. /// </summary> /// <param name="entry"> The update entry which resulted in the conflict(s). </param> /// <param name="concurrencyConflicts"> The conflicting properties with their associated database values. </param> protected virtual void ThrowUpdateConcurrencyException( [NotNull] IUpdateEntry entry, [NotNull] Dictionary <IProperty, object> concurrencyConflicts) { Check.NotNull(entry, nameof(entry)); Check.NotNull(concurrencyConflicts, nameof(concurrencyConflicts)); if (_sensitiveLoggingEnabled) { throw new DbUpdateConcurrencyException( InMemoryStrings.UpdateConcurrencyTokenExceptionSensitive( entry.EntityType.DisplayName(), entry.BuildCurrentValuesString(entry.EntityType.FindPrimaryKey().Properties), entry.BuildOriginalValuesString(concurrencyConflicts.Keys), "{" + string.Join( ", ", concurrencyConflicts.Select( c => c.Key.Name + ": " + Convert.ToString(c.Value, CultureInfo.InvariantCulture))) + "}"), new[] { entry }); } throw new DbUpdateConcurrencyException( InMemoryStrings.UpdateConcurrencyTokenException( entry.EntityType.DisplayName(), concurrencyConflicts.Keys.Format()), new[] { entry }); }