Dapper.Rainbow с существующей схемой базы данных
Я пробую Даппер. Мне нравится то, что я видел до сих пор. Для того, чтобы сделать простой CRUD, я использую Dapper.rainbow. Это работает очень хорошо. Однако это работает, только если таблица имеет столбец идентификаторов с именем Id. Имеет смысл иметь такую базу данных, но я не могу попросить изменить имя столбца в базе данных, просто чтобы использовать Dapper. Чтобы быть более понятным, я работаю с базой данных, как Northwind Db. Имя таблицы повторяется везде в столбце Id.
Чтобы справиться с этим, я изменил код Dapper.Rainbow, как показано ниже:
public T Get(TId id,string idColumnName="Id")
{
return database.Query<T>("select * from " + TableName + " where "+idColumnName+" = @id", new { id }).FirstOrDefault();
}
Есть ли лучший способ справиться с этим, например, сопоставление столбцов / аннотации или что-то совершенно другое?
Я читал такие вопросы
Вручную сопоставьте имена столбцов со свойствами класса
Dapper.Rainbow VS Dapper.Contrib
(Я столкнулся с подобной небольшой проблемой с Dapper.Contrib, я спрошу об этом отдельно).
Обновление - Не уверен, что ответы применимы к моей проблеме Dapper.Rainbow здесь (Atleast, я не вижу, как).
Спасибо за помощь заранее!
1 ответ
У меня была похожая проблема. Существующие расширения Dapper не соответствуют моему идеальному шаблону. Я хотел простых операций CRUD с умными настройками по умолчанию без каких-либо дополнительных. Я также хотел иметь модели с дополнительными свойствами, которые не отображаются непосредственно в базу данных. Например - свойство FullName, которое объединяет FirstName и LastName в своем геттере - и не добавляет FullName в операторы Insert и Update.
Я хотел, чтобы столбец первичного ключа был идентификатором в большинстве случаев, но позволял переопределять атрибутом.
Наконец, я хотел, чтобы имя таблицы совпадало с именем класса по умолчанию, но разрешить переопределение атрибутом.
В итоге я написал собственное расширение для Dapper, которое решает эти проблемы. Это на Github и Nuget. Надеюсь, это будет полезно для вас.