Я новичок в Dapper микро ОРМ. Пока я могу использовать его для простых вещей, связанных с ORM, но не могу сопоставить имена столбцов базы данных со свойствами класса.
Например, у меня есть следующая таблица базы данных:
Table Name: Person
person_id int
first_name varchar(50)
last_name varchar(50)
и у меня есть класс с именем Person:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Обратите внимание, что имена моих столбцов в таблице отличаются от имени свойства класса, которому я пытаюсь сопоставить данные, полученные из результата запроса.
var sql = @"select top 1 PersonId,FirstName,LastName from Person";
using (var conn = ConnectionFactory.GetConnection())
{
var person = conn.Query<Person>(sql).ToList();
return person;
}
Приведенный выше код не будет работать, поскольку имена столбцов не соответствуют свойствам объекта (Person). В этом сценарии, что я могу сделать в Dapper, чтобы вручную сопоставить (например person_id => PersonId
) имена столбцов со свойствами объекта?
Ответы:
Это прекрасно работает:
У Dapper нет средства, позволяющего указывать атрибут столбца , я не против добавления его поддержки, при условии, что мы не используем зависимость.
источник
Dapper теперь поддерживает настраиваемый столбец для сопоставления свойств. Это делается через интерфейс ITypeMap . CustomPropertyTypeMap класс обеспечивается Dapper , что может сделать большую часть этой работы. Например:
И модель:
Важно отметить, что реализация CustomPropertyTypeMap требует, чтобы атрибут существовал и совпадал с одним из имен столбцов, иначе свойство не будет отображено. Класс DefaultTypeMap предоставляет стандартную функциональность и может быть использован для изменения этого поведения:
И с этим на месте становится легко создать собственный преобразователь типов, который будет автоматически использовать атрибуты, если они присутствуют, но в противном случае вернется к стандартному поведению:
Это означает, что теперь мы можем легко поддерживать типы, которым требуется карта, используя атрибуты:
Вот Gist для полного исходного кода .
источник
В течение некоторого времени должно работать следующее:
источник
MatchNamesWithUnderscores
опции. В лучшем случае, если бы мы провели рефакторинг API конфигурации, я бы оставилMatchNamesWithUnderscores
член на месте (который все еще работает, в идеале) и добавил бы[Obsolete]
маркер, чтобы указать людям на новый API.Вот простое решение, которое не требует атрибутов, позволяющих вам исключить код инфраструктуры из ваших POCO.
Это класс для работы с отображениями. Словарь будет работать, если вы отобразите все столбцы, но этот класс позволяет вам указать только различия. Кроме того, он включает в себя обратные карты, так что вы можете получить поле из столбца и столбец из поля, что может быть полезно при выполнении таких задач, как генерация операторов SQL.
Настройте объект ColumnMap и сообщите Dapper использовать сопоставление.
источник
Я делаю следующее, используя динамические и LINQ:
источник
Простой способ добиться этого - просто использовать псевдонимы столбцов в вашем запросе. Если у вас есть столбец базы данных,
PERSON_ID
а ваш объект - свойство,ID
вы можете просто сделать этоselect PERSON_ID as Id ...
в своем запросе, и Dapper подберет его, как и ожидалось.источник
Взято из Dapper Tests, которое в настоящее время находится на Dapper 1.42.
Вспомогательный класс для получения имени из атрибута Description (лично я использовал Column, как пример @kalebs)
Класс
источник
GetDescriptionFromAttribute
кreturn (attrib?.Description ?? member.Name).ToLower();
и добавил.ToLower()
кcolumnName
в карте не должно быть чувствительны к регистру.Работа с картографией - это пограничный переход в реальную землю ОРМ. Вместо того, чтобы бороться с этим и поддерживать Dapper в его истинно простой (быстрой) форме, просто слегка измените ваш SQL следующим образом:
источник
Прежде чем открывать соединение с вашей базой данных, выполните этот фрагмент кода для каждого из ваших классов Poco:
Затем добавьте аннотации данных в ваши классы Poco следующим образом:
После этого у вас все готово. Просто сделайте запрос, что-то вроде:
источник
Если вы используете .NET 4.5.1 или выше, извлекайте Dapper.FluentColumnMapping для отображения стиля LINQ. Это позволяет полностью отделить отображение БД от вашей модели (нет необходимости в аннотациях)
источник
Это свиное отступление от других ответов. Это просто мысль, которая у меня была для управления строками запроса.
Person.cs
Метод API
источник
для всех вас, кто использует Dapper 1.12, вот что вам нужно сделать, чтобы сделать это:
и закомментируйте это.
источник
Решение Калеба Педерсона сработало для меня. Я обновил ColumnAttributeTypeMapper, чтобы разрешить настраиваемый атрибут (требовалось два разных сопоставления для одного и того же объекта домена), и обновил свойства, чтобы разрешить частные установщики в тех случаях, когда необходимо получить поле и типы различаются.
источник
Я знаю, что это относительно старая тема, но я подумал, что брошу туда то, что сделал.
Я хотел, чтобы отображение атрибутов работало глобально. Либо вы соответствуете имени свойства (по умолчанию), либо вы соответствуете атрибуту столбца в свойстве класса. Я также не хотел устанавливать это для каждого класса, который я отображал. Таким образом, я создал класс DapperStart, который я вызываю при запуске приложения:
Довольно просто Не уверен, с какими проблемами я столкнусь, поскольку я только что написал это, но это работает.
источник
CreateChatRequestResponse
это не будет заменено тем,T
как это будет проходить через все объекты Entity. Пожалуйста, поправьте меня, если я ошибаюсь.Простое решение проблемы, которую пытается решить Kaleb, - это просто принять имя свойства, если атрибут столбца не существует:
источник