Subsonic BatchQuery.Queue导致'无法决定考虑哪个属性的密钥...'异常

时间:2009-07-25 15:08:32

标签: subsonic

我刚刚开始使用Subsonic 3.0 ActiveRecord,并且正在尝试实现类似SubSonic docs中的批量查询。我正在使用批处理,因此我可以一次查询用户和用户订单列表。

当我调用BatchQuery.Queue()方法,添加“select user”查询时,SubSonic抛出以下异常:

System.InvalidOperationException:无法决定将哪个属性视为Key - 您可以创建一个名为'ID'或使用SubSonicPrimaryKey属性标记一个

代码如下:

var db = new MyDB();
var userQuery = from u in db.Users //gets user by uid
                where u.uid == 1
                select u;

var provider = ProviderFactory.GetProvider();
var batch = new BatchQuery(provider);
batch.Queue(userQuery); //exception here

//create and add "select users orders" query here...

首先要做的事 - 为什么这个错误?我的SubSonic Users对象知道它是PK。 “uid”是数据库中的PK,生成的代码反映了这一点。我认为SubSonicPrimaryKey属性是针对SimpleRepository的?这种批处理方式不适用于ActiveRecord吗?

我可以问一些其他问题,但我会留下来。如果有人可以帮我弄清楚发生了什么以及如何发出2个批量查询,我将不胜感激!

修改 - 经过进一步调查

我使用调试器运行了源代码。 Adam是正确的 - Objects.cs中的ToSchemaTable()方法显然构建了我的模式并且未能找到PK。在最后,它尝试查找名为“ID”的列属性并将其标记为PK,否则它将抛出异常。我添加了一个“UID”检查,这有效!

仍然......我很困惑。我承认在剥离了一层又一层的源代码之后有点迷失,但似乎这部分代码试图为我的表构建一个架构并完全忽略我生成的User类 - 这很好地识别哪个列/属性是PK!我需要将所有键“ID”命名为ActiveRecord似乎不太正确。

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找的答案是,这对我来说是一个非常愚蠢的错误。我希望下周推出另一个版本,如果你能把它放在问题清单上,我真的很感激。我道歉......

答案 1 :(得分:1)

SubSonic希望您的主键被称为Id,因此它变得混乱。 SubSonicPrimaryKey用于简单存储库,但我假设在不同模板之间共享抛出异常的位置。如果您将PK重命名为Id或id或ID,则查询将起作用。