Dapper不读取基类型字段中的值

时间:2018-01-14 21:00:27

标签: c# sqlite dapper

基本类型:

public class TreeRecord
{
    public long id;
    public long? parent_id;
}

记录类型:

public class TestRecord : TreeRecord
{
    public string name;
}

使用Dapper进行插入将失败,因为它无法找到值。我怀疑是因为某些字段来自基类型。

public long Add(T record, bool returnIndex = false)
{
    var query =
        $"INSERT INTO {TableName} ({string.Join(", ", _fields)}, parent_id) " +
        $"VALUES (@{string.Join(", @", _fields)}, @parent_id);";

    // Seems like Dapper won't flatten this type hierachy.
    _connection.Execute(query, record);
}

我正在使用通用容器,其中T从TR继承并“扩展”字段。因此,我不能简单地为Dapper的值参数提供扁平的new ...构造。 _fields中的T是非基本字段,在这种情况下name只有TestRecord

抛出的异常是:

System.InvalidOperationException: Must add values for the following parameters: @name, @parent_id

即使两者都已设置(p_id为null,名称为Books)(在Dapper的Execute内):

这是一个扁平化的问题吗? IMO,因为TestRecord上的所有字段(包括基本字段)都可以由var.field访问,因此Dapper应该可以使用它。

1 个答案:

答案 0 :(得分:1)

您在这里看到的行为是因为 Dapper 最终在寻找属性而不是字段。在幕后,它调用 typeof(RecordType).GetProperties(); 并枚举它们以生成动态参数。

如果您将类型更改为:

public class TreeRecord
{
    public long id { get; set; }
    public long? parent_id { get; set; }
}

public class TestRecord : TreeRecord
{
    public string name { get; set; }
}

...那么您应该会看到它在基本类型或继承类型上工作。