Dapper如何处理null值 Dapper数据库null映射C# nullable类型

来源:这里教程网 时间:2026-02-21 17:33:28 作者:

Dapper 会自动将数据库中的

NULL
值映射为 C# 中对应的可空类型(如
int?
DateTime?
string
等),无需额外配置,但需确保实体属性类型与数据库字段语义匹配。

基础映射规则

Dapper 按照 .NET 类型系统进行隐式转换:

数据库
NULL
→ C# 可空值类型(
int?
bool?
DateTime?
)会被设为
null
数据库
NULL
→ C# 非可空值类型(
int
DateTime
)会抛出
InvalidOperationException
(“当转换为类型 'Int32' 时,空值无法转换”)
数据库
NULL
→ C# 引用类型(
string
object
、自定义类)直接映射为
null

实体类设计建议

为避免运行时异常,实体属性应与数据库字段的 nullability 保持一致:

数据库列允许 NULL → C# 属性用可空值类型或引用类型(如
public int? Age { get; set; }
数据库列不允许 NULL → C# 属性可用非可空类型(如
public string Name { get; set; }
,注意
string
本身可为 null,但业务上可配合校验)
使用
[Column("xxx")]
或约定命名即可,Dapper 不依赖 DataAnnotations 处理 null 映射

手动处理 NULL 的场景

某些情况下需要显式控制 null 行为,例如默认值回退或类型不匹配:

查询时用 SQL
ISNULL
/
COALESCE
提前转换(推荐,贴近数据层):
SELECT Id, ISNULL(Age, 0) AS Age FROM Users
映射后代码中判空处理:
var user = conn.QueryFirstOrDefault<User>("SELECT * FROM Users WHERE Id = @id", new { id });<br>int actualAge = user.Age ?? 18;
使用
Query<t></t>
的泛型重载配合自定义映射函数(较少用,适合复杂逻辑)

ValueTuple 与匿名类型的 NULL 处理

使用匿名类型或 ValueTuple 查询时,Dapper 同样遵守类型推导规则:

var result = conn.QuerySingleOrDefault(...);
age
null
时安全
若写成
(int id, string name, int age)
而数据库返回 NULL,则抛异常
匿名类型(
new { ... }
)中属性类型由 Dapper 推断,对 NULL 敏感,建议显式用可空类型或改用具名实体类

基本上就这些。只要实体属性类型声明合理,Dapper 的 null 映射是透明且可靠的。

相关推荐