我有两个类:
class Foo{
public int FooId { get; set; }
...
public Bar Bar { get; set }
}
class Bar{
public int BarId { get; set; }
public int FooId { get; set }
...
}
然后当我像这样运行查询时:
sqlConnection.Query<Foo, Bar, Foo>(
"SELECT * FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId",
(foo, bar) => {
foo.Bar = bar;
return foo;
},
splitOn: "FooId");
结果将是 Foo 和 Bar 上的所有属性都映射到 Bar.BarId 除外。 根据我的 Bar 类检查数据库中的列名和类型后,我仍然找不到任何差异。
我偶然发现的一件奇怪的事情是,如果我写:
"SELECT *, BarId AS BarId FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId"
Bar.BarId 实际上按预期映射,是我误解了如何使用 Dapper 还是这是一个错误?
最佳答案
它试图对 FooId
进行拆分,因此每次它看到 FooId
时,它都在切割数据。此用例本质上旨在用于所有表都具有可预测键(如 Id
)的场景(并不少见)。在你的情况下,这不是你想要的,因为你从数据库中得到:
FooId, a, b, c | BarId, FooId, x, y, z
^^ from Foo ^^ | ^^ from Bar ^^
但是,在 FooId
上拆分为:
FooId, a, b, c, BarId | FooId, x, y, z
这就是为什么 BarId
没有包含在第二个对象中的原因,也是为什么将它添加到末尾使其起作用的原因。
还有另一种用法,IIRC,它接受顺序键进行拆分;你会使用:
splitOn: "FooId,BarId"
关于c# - Dapper 多选 : Nested class primary key doesn't map unless using "AS",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6705270/