基本类型:
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应该可以使用它。
答案 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; }
}
...那么您应该会看到它在基本类型或继承类型上工作。