public override void Add <TEntity>(TEntity entity)
        {
            Guard.NotNull(entity, nameof(entity));

            ModelConventionHelper.Validate <TEntity>(entity);

            var entityType = typeof(TEntity);
            var keyValues  = Conventions.GetPrimaryKeyValues(entity);

            if (_db.TryFind <TEntity>(keyValues, out object _))
            {
                throw new InvalidOperationException(
                          string.Format(
                              CultureInfo.CurrentCulture,
                              Resources.EntityAlreadyBeingTrackedInStore,
                              entityType));
            }

            if (TryGeneratePrimaryKey <TEntity>(entity, out var newKey))
            {
                // assumes we only have a single key since
                // we cannot generated for a composite key anyways
                keyValues[0] = newKey;
            }

            _db.AddOrUpdate <TEntity>(entity, keyValues);
        }
        public override void Remove <TEntity>(TEntity entity)
        {
            Guard.NotNull(entity, nameof(entity));

            ModelConventionHelper.Validate <TEntity>(entity);

            var keyValues = Conventions.GetPrimaryKeyValues(entity);

            if (!_db.TryFind <TEntity>(keyValues, out object _))
            {
                throw new InvalidOperationException(Resources.EntityNotFoundInStore);
            }

            _db.Remove <TEntity>(keyValues);
        }