当splitOn列不在子对象中时,Dapper多映射不返回null对象

时间:2017-03-03 21:01:18

标签: dapper

我正在使用dapper 1.50.2与MySQL并遇到一个问题,试图将左外连接子对象映射到其父对象。如果我拆分了子对象中实际不存在的列别名,Dapper总是会创建一个具有默认属性的子对象,即使左连接中没有任何内容也是如此。

我创建了一个简单的例子来证明这一点:

public class ParentRecord
{
    public string MemberID { get; set; }
    public ChildRecord Child { get; set; }
}

public class ChildRecord
{
    //public string Split { get; set; }
    public string SomeField { get; set; }
}

using (MySqlConnection connection = new MySqlConnection(connectionString))
{
    ParentRecord result = connection.Query<ParentRecord, ChildRecord, ParentRecord>(
    @"SELECT 'FakeID' AS MemberID, NULL AS Split, NULL AS SomeField",
        (mt, crt) =>
        {
            mt.Child = crt;
            return mt;
        },
        splitOn: "Split").Single();
}

我希望这会导致ParentRecord的Child属性设置为null,但Child属性设置为带有所有默认字段的ChildRecord。

如果我取消注释ChildRecord中的Split属性,或者我在SomeField上拆分,那么这就像我期望的那样。

这有什么好的解决方法吗?

在我正在处理的实际查询中,有多个具有相同名称的主键和外键字段,而不是将POCO中的属性名称更改为唯一。我更喜欢能够使用刚刚分割的列别名。我知道这通常不是Dapper如何开始工作的。

任何帮助都将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为当您为ctr参数赋予属性时,对象Child会默认初始化。然后我实施的解决方案是:

ParentRecord result = connection.Query<ParentRecord, ChildRecord, ParentRecord>(
    @"SELECT 'FakeID' AS MemberID, NULL AS Split, NULL AS SomeField",
        (mt, crt) =>
        {
            if (crt.SomeField != null){ mt.Child = crt; }
            return mt;
        },
        splitOn: "Split").Single();