Dapper.Rainbow Database.Insert - удаляет Id из объекта - как переопределить?

Я использую Dapper и Dapper.Rainbow для своего ORM (ну просто переключаюсь на него с EF).

Мои таблицы имеют идентификаторы Guid /uniqueidentifiers в качестве идентификаторов.

Я делаю вставку, используя Dapper Rainbow, и она удаляет Id-параметр.

См. Строку 62 метода вставки... https://github.com/StackExchange/Dapper/blob/master/Dapper.Rainbow/Database.cs

        /// <summary>
        /// Insert a row into the db
        /// </summary>
        /// <param name="data">Either DynamicParameters or an anonymous type or concrete type</param>
        /// <returns></returns>
        public virtual int? Insert(dynamic data)
        {
            var o = (object)data;
            List<string> paramNames = GetParamNames(o);
            paramNames.Remove("Id");

            string cols = string.Join(",", paramNames);
            string colsParams = string.Join(",", paramNames.Select(p => "@" + p));
            var sql = "set nocount on insert " + TableName + " (" + cols + ") values (" + colsParams + ") select cast(scope_identity() as int)";

            return database.Query<int?>(sql, o).Single();
        }

Итак, хотя метод помечен как виртуальный, как мне его переопределить?

Все остальные необходимые методы, такие как GetParamNames, являются внутренними, так что лучше всего просто клонировать и запустить мою собственную версию Dapper.Rainbow?

1 ответ

Dapper.Rainbow имеет несколько ограничений:

  • Нет поддержки составного сопоставления клавиш.
  • Имя столбца идентификации для всех таблиц должно называться Id.

Он ожидает, что идентификаторы будут идентичностями, поэтому он удаляет их...

В качестве альтернативы вы можете попробовать Dapper-Extensions, который поддерживает первичные ключи Integer и Guid. Или просто используйте Dapper без дополнительных расширений CRUD...

Другие вопросы по тегам