Каков наилучший способ для dapper сопоставить имя столбца, которое отличается от имени свойства класса?C#

Место общения программистов C#
Anonymous
Каков наилучший способ для dapper сопоставить имя столбца, которое отличается от имени свойства класса?

Сообщение Anonymous »

Для упрощения предположим, что у меня есть следующие определения таблиц в Oracle:

Код: Выделить всё

create table customer
(
id   number(10),
name nvarchar2(1024),
primary key (id)
);

create table customer_order
(
id          number(10),
customer_id number(10),
name        nvarchar2(1024),
primary key (id),
foreign key (customer_id) references customer(id)
);
И у меня есть следующие классы для объектов базы данных:

Код: Выделить всё

public class Customer
{
public int ID { get; set; }
public string? Name { get; set; }

public List CustomerOrders { get; set; } = new List();
}

public class CustomerOrder
{
public int ID { get; set; }
public string? Name { get; set; }
}
Допустим, я хочу получить список клиентов, где каждый объект клиента имеет список CustomerOrder, используя следующий SQL:

Код: Выделить всё

select
a.id customer_id, a.name customer_name,
b.id customer_order_id, b.name customer_order_name
from
customer a
inner join
customer_order b on  a.id = b.customer_id
order by
a.id, b.id
Поскольку обе таблицы (

Код: Выделить всё

customer
и customer_order) имеют одинаковые идентификаторы столбцов и NAME, мне нужно изменить их на XXX_ID и XXX_NAME (где XXX = CUSTOMER или CUSTOMER_ORDER); в противном случае Oracle изменит их на ID_1, NAME_1 и т. д. (если в результате есть повторяющиеся имена столбцов).
А также оба класса C# (

Код: Выделить всё

Customer
и CustomerOrder) также имеют одинаковые идентификаторы свойств и Name.
Мы хотим, чтобы база данных и определение класса C# были чисто и не многословно (идентификатор в Customer — это идентификатор клиента, и нет необходимости указывать его явно).
Поскольку Dapper сопоставляет столбцы базы данных с C# свойства либо по имени параметра конструктора, либо по имени свойства, как это может быть сопоставлено Dapper автоматически или как лучше всего это сделать в Dapper?
Даже я могу изменить имя столбца в Уровень SQL-запроса ( на CUSTOMER_ID и т. д.), имя свойства класса C# не может быть изменено таким образом. Я пытался использовать System.ComponentModel.DataAnnotations.Schema.ColumnAttribute как с именем столбца в верхнем регистре (Oracle должен возвращать верхний регистр, но все равно пробовал оба), так и с именем столбца в нижнем регистре (

Код: Выделить всё

[Column(name: "CUSTOMER_ID")]
, [Column(name: "customer_id")]) и т. д.).
Похоже, что Dapper не поддерживает

Код: Выделить всё

System.ComponentModel.DataAnnotations.Schema.ColumnAttribute
Любая помощь приветствуется.

Подробнее здесь: https://stackoverflow.com/questions/791 ... from-the-c

Вернуться в «C#»