/// <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 });
        }