Подтвердить что ты не робот

Могу ли я указывать имена столбцов DB для сопоставлений dapper-dot-net?

Есть ли способ с dapper-dot-net использовать атрибут для указания имен столбцов, которые должны использоваться, а не имени свойства?

public class Code
{
    public int Id { get; set; }
    public string Type { get; set; }
    // This is called code in the table.
    public string Value { get; set; }
    public string Description { get; set; }
}

Я хотел бы иметь возможность называть свои свойства независимо от того, что я выбираю. В нашей базе данных нет согласованного соглашения об именах.

Если не с dapper, есть ли дополнительные подобные опции?

4b9b3361

Ответ 1

Вы также можете проверить Dapper-Extensions.

Расширения Dapper - это небольшая библиотека, которая дополняет Dapper, добавляя основные операции CRUD (Get, Insert, Update, Delete) для ваших POCOs.

Он имеет auto class mapper, где вы можете указать свои пользовательские сопоставления полей. Например:

public class CodeCustomMapper : ClassMapper<Code>
{
    public CodeCustomMapper()
    {
        base.Table("Codes");
        Map(f => f.Id).Key(KeyType.Identity);
        Map(f => f.Type).Column("Type");
        Map(f => f.Value).Column("Code");
        Map(f => f.Description).Column("Foo");
    }
}

Затем вы просто выполните:

using (SqlConnection cn = new SqlConnection(_connectionString))
{
    cn.Open();
    var code= new Code{ Type = "Foo", Value = "Bar" };
    int id = cn.Insert(code);
    cn.Close();
}

Имейте в виду, что вы должны хранить свои пользовательские карты в той же сборке, что и ваши классы POCO. В библиотеке используется отражение, чтобы найти пользовательские карты, и он сканирует только одну сборку.

Обновить:

Теперь вы можете использовать SetMappingAssemblies для регистрации списка сборок для сканирования:

DapperExtensions.SetMappingAssemblies(new[] { typeof(MyCustomClassMapper).Assembly });

Ответ 2

Если вы используете оператор select непосредственно или в процедуре, вы можете просто псевдонизировать столбцы.

SELECT code as Value FROM yourTable

Ответ 3

Другой подход - просто вручную сопоставить его с динамическим результатом.

var codes = conn.Query<dynamic>(...sql and params here...)
                 .Select<dynamic,Code>(s=>new Code{Id = s.Id, Type = s.Type, Value = s.code, Description = s.Description});

Очевидно, что это вводит сценарии безопасности типов, поскольку вы запрашиваете динамику. Кроме того, вам нужно вручную сопоставить столбцы, которые являются обломками.

Тем не менее, мне нравится такой подход, потому что он настолько проклят прозрачно. Вы можете использовать, если это необходимо (как в случае с Enums), и в основном просто делать то, что вам нужно сделать, чтобы перейти от набора записей db к вашим свойствам.

Ответ 4

Для выбора вы можете добавить в свои классы конструкторы для выполнения сопоставления. Имена параметров конструктора должны соответствовать столбцам таблицы.

Ниже приведен пример из источника. Таблица будет правильно отображена в класс.

Таблица:

CREATE TABLE #Users (Id int, Name varchar(20))

Класс:

   class UserWithConstructor
    {
        public UserWithConstructor(int id, string name)
        {
            Ident = id;
            FullName = name;
        }
        public int Ident { get; set; }
        public string FullName { get; set; }
    }