假设我有一个类模型,我希望在该模型中有非缺省值

public class MyModel()
{
    public int PropertyOne { get; set; }
    public int? PropertyTwo { get; set; }
    public string PropertyThree { get; set; }
}

假设我用下面的查询查询MyModel

SELECT
   NULL as PropertyOne,
   NULL as PropertyTwo,
   NULL as PropertyThree

如果我将其映射到MyModel类,则PropertyOne=0、PropertyTwo=空、PropertyThree=空.

默认情况下,如果Dapper在读取时遇到DBNull值,则它不会调用任何设置器,因此PropertyOne的缺省值为int,即0.

  1. 我不想要这样,我想验证我总是从我的查询中获得PropertyOne的非空值,并且如果读取器遇到DBNull,我想得到一个异常.

  2. 假设我也不希望PropertyThree的值为空.当映射发生时,我也可以使用Dapper以某种方式实现这一判断吗?我可以通过使用如下模型中的属性来完成此操作吗?

public class MyModel()
{
    public int PropertyOne { get; set; }
    public int? PropertyTwo { get; set; }
    [NotDBNull]
    public string PropertyThree { get; set; }
}

因此,理想情况下,我想实现的是使用上述模型并具有以下逻辑:

case 1:PropertyOne获取DBNull,但它不能为空=抛出异常

case 2:PropertyTwo获取DBNull,但它可为nullable=>都是好的

case 3:PropertyThree获取DBNull,但标记为[NotDBNull]属性=>引发异常

有没有什么方法可以在不使用其他形式的验证的情况下使用Dapper来实现这一点?

推荐答案

Dapper.AOT工作(我希望!它的意思是)以你描述的方式,对于值类型和引用类型(如果在源代码中启用了NRT,则是后者).

我不可能从您的代码中知道是否启用了NRT,但是:

  • 启用NRTS的string表示"积极预期非空"
  • NRT使能时为string?表示"允许空"
  • string不启用NRT意味着"允许空"
  • int表示"积极预期非空"
  • int?表示"允许为空"

所以:try Dapper.AOT个,看看它的进展如何!根据反馈,我们可能会添加一个属性来软化这种行为,使其回到Dapper Vanilla的空处理,但是:您所描述的是我们want件事情是如何继续工作的.

Csharp相关问答推荐

等待限制选项似乎不适用于频道

无法从具有一对多关系的C#类中使用Swagger创建记录

如何创建ASP.NET Core主机并在同一进程中运行请求

一小时后,自定义缓存停止在App Insight中保存

为什么Blazor值在更改后没有立即呈现?

C#DateTime.ToString在ubuntu和centos中返回不同的结果

ASP.NET核心REST API返回一个非常大的数字

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

C#-VS2022:全局使用和保存时的代码清理

未在数据流块之间传播完成

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

如何比较C#中的L和ł(波兰字符)返回TRUE

如何将端点(或с匹配请求并判断其路径)添加到BCL?

如何在microsoft.clearscript.v8的jsondata中使用Linq

类/值和日期的泛型方法

在等待OnGetAsync时打开Razor Page显示微调器

根据优先级整理合同列表

如何将行添加到DataGrid以立即显示它?

CsvHelper在第二次迭代时抛出System.ObjectDisposedException

如何在flutter dart中使用publicKey.xml文件进行rsa加密,我遇到了问题Exception:Could not parse BigInt