gpt4 book ai didi

c# - Dapper 多选 : Nested class primary key doesn't map unless using "AS"

转载 作者:行者123 更新时间:2023-11-30 14:39:15 25 4
gpt4 key购买 nike

我有两个类:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com