如何在Dapper上执行严格的映射

时间:2016-08-17 19:04:27

标签: c# .net dapper

我正在使用dapper将SQL结果集直接映射到我的C#对象,一切正常。

我正在使用这样的语句来进行映射

  

var result = connection.Query< MyClass>(“sp_select”,);

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

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

2 个答案:

答案 0 :(得分:1)

您无法自动执行此操作"自动执行"带有属性或标志。您可以按照此open Github issue获取更多背景信息。

这可以通过 手动 来完成,方法是在select子句中自己映射每个属性,尽管此时你已经失去了很多力量,易于使用Dapper。

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

答案 1 :(得分:1)

您还可以尝试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列,测试将失败。

您还可以忽略Custom Maps列<:p>

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