如何在Dapper上执行严格映射

本文关键字:映射 执行 Dapper | 更新日期: 2023-09-27 18:02:53

我使用dapper将SQL结果集直接映射到我的c#对象,一切都工作得很好。

我使用这样的语句来做映射

var result = connection.Query<>("sp_select",);

,但是这个语句似乎没有强制类字段和从数据库返回的列之间的精确映射。这意味着,当POCO上的字段在结果集中不存在时,它不会失败。

我确实喜欢这样一个事实,即实现是松散的,并且没有强制任何限制权利,但是dapper是否有任何特性允许我在认为映射成功之前从结果集中请求某些字段?

如何在Dapper上执行严格映射

你也可以试试Dapper-Extensions

下面是一个例子:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
}
[TestFixture]
public class DapperExtensions
{
    private SqlConnection _connection;
    [SetUp]
    public void Init()
    {
        _connection = new SqlConnection(@"Data Source=.'sqlexpress;Integrated Security=true; Initial Catalog=mydb");
        _connection.Open();
        _connection.Execute("create table Person(Id int not null, FirstName varchar(100) not null, LastName varchar(100) not null)");
        _connection.Execute("insert into Person(Id, FirstName, LastName) values (1, 'Bill', 'Gates')");
    }
    [TearDown]
    public void Teardown()
    {
        _connection.Execute("drop table Person");
        _connection.Close();
    }
    [Test]
    public void Test()
    {
        var result = _connection.Get<Person>(1);
    }
}

由于Person表中缺少Address列,测试将失败。

你也可以忽略自定义映射的列:

public class PersonMapper : ClassMapper<Person>
{
    public PersonMapper()
    {
        Map(x => x.Address).Ignore();
        AutoMap();
    }
}

您无法通过属性或标志"自动"执行此操作。你可以关注这个开放的Github问题来了解更多的背景信息。

这可以通过在select子句中自己映射每个属性来手动来完成,尽管此时您已经失去了Dapper的许多功能和易用性。

var result = connection.Query<MyClass>("sp_select")
                       .Select(x => 
                       {
                           // manually map each property and verify
                           // that the data is returned
                       });