Я экспериментирую 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 здесь. Какие-либо предложения? Я делаю это неправильно? Спасибо!