Dapper micro ORM, независимый от базы данных и MySql Guid тип - PullRequest
3 голосов
/ 19 сентября 2011

Я экспериментирую Dapper на проекте с питомцами. Я использую SQLite для запуска всех тестов и MySql для «производства». Однако я не уверен, как лучше всего использовать Dapper для обработки не зависящей от базы данных ситуации.

Особая проблема, с которой я сталкиваюсь, связана с MySql, который не поддерживает тип Guid для первичного ключа, поэтому я использую varchar (40) в качестве типа (SQLite поддерживает уникальный идентификатор который является гидом). Так что здесь возникает проблема, если у меня есть общий репозиторий, как показано ниже, у меня возникнут проблемы при попытке выбрать из базы данных MySql. Поскольку свойство типа Id - Guid, и Dapper выдает « Ошибка анализа столбца 10 », поскольку тип varchar не соответствует типу guid.

Если я поменяю свойство Id с guid на int, тогда сырой sql внутри GetById будет еще сложнее, что я даже не знаю, как написать. Это будет что-то вроде: 1. начать транзакцию, 2. вставить, 3. выбрать последний вставленный идентификатор и вернуть его. Так что я собираюсь пойти, если тип базы данных mysql, то использовать last_insert_id , или если это sqlite, то использовать last_insert_rowid ? Поскольку синтаксис raw sql будет сильно отличаться от базы данных к базе данных ...

public IEnumerable<T> GetById(Guid id) //convention: Id is always of type Guid.
{
  return UnitOfWork.DbConnection.Query<T>(
      string.Format(
        "select * from {0} where Id = @Id", typeof (T).Name), new {Id = id});
}

Другими примерами может быть ограничение количества возвращаемых строк (особенно для подкачки) и так далее. Итак, как я собираюсь писать независимые от базы данных необработанные SQL-запросы с dapper? А может в моей ситуации Даппер не подходит? Возможно, мне следует использовать тот же старый NHibernate здесь. Какие-либо предложения? Я делаю это неправильно? Спасибо!

Ответы [ 2 ]

10 голосов
/ 17 июля 2013

Попробуйте использовать CHAR (36) в качестве типа данных для первичного ключа в MySQL, это будет преобразовано в Guid с помощью MySQl Connector - я использую MySQL-версию 6.3.4.Также работает с Dapper.

1 голос
/ 20 сентября 2011

Два вопроса

  1. Если все, что вы делаете, это юнит-тесты, то вам вообще не нужно подключаться к базе данных.

  2. Если вы делаете интеграцию (и любые другие, кроме этого), почему бы вам не запустить тесты на рабочей версии БД, потому что некоторые особенности могут сделать ваш тест успешным, но производственный код потерпит неудачу.Предполагается, что интеграционные тесты будут выполняться в конфигурации, аналогичной производственной, в противном случае они не будут актуальны.

...