dapper 映射与类属性名称不同的列名称的最佳方法是什么

问题描述 投票:0回答:1

为了简化情况,假设我在 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

非常感谢任何帮助。

c# oracle dapper
1个回答
0
投票

Dapper 对此仅有边缘支持;但是,Dapper.AOT(https://aot.dapperlib.dev/ - 由同一开发人员为 Dapper 进行的 AOT 扩展,具有更多配置支持)通过

[DbValue(Name=...)]
[Column(...)]
允许此选项。

© www.soinside.com 2019 - 2024. All rights reserved.