为了简化情况,假设我在 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<CustomerOrder> CustomerOrders { get; set; } = new List<CustomerOrder>();
}
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
)具有相同的列ID
和NAME
,我需要将它们更改为XXX_ID
和XXX_NAME
(其中XXX = CUSTOMER或CUSTOMER_ORDER);否则,Oracle 会将它们更改为 ID_1、NAME_1 等(如果结果中存在重复的列名)。
此外,两个 C# 类(
Customer
和 CustomerOrder
)也具有相同的属性 ID
和 Name
。
我们希望数据库和 C# 类定义简洁而不冗长(
ID
中的Customer
是客户 ID,无需明确说出)。
由于 Dapper 通过构造函数参数名称或属性名称将数据库列映射到 C# 属性,因此 Dapper 如何自动映射,或者在 Dapper 中执行此操作的最佳方法是什么?
即使我可以在 SQL 查询级别更改列名称(
ID
到 CUSTOMER_ID
等),C# 类属性名称也不能这样更改。我尝试将 System.ComponentModel.DataAnnotations.Schema.ColumnAttribute
与大写(Oracle 应该返回大写,但无论如何都尝试了)和小写列名称([Column(name: "CUSTOMER_ID")]
、[Column(name: "customer_id")]
)等)一起使用。
Dapper 好像不支持
System.ComponentModel.DataAnnotations.Schema.ColumnAttribute
非常感谢任何帮助。
Dapper 对此仅有边缘支持;但是,Dapper.AOT(https://aot.dapperlib.dev/ - 由同一开发人员为 Dapper 进行的 AOT 扩展,具有更多配置支持)通过
[DbValue(Name=...)]
或 [Column(...)]
允许此选项。