我刚刚开始使用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似乎不太正确。
答案 0 :(得分:2)
我认为您正在寻找的答案是,这对我来说是一个非常愚蠢的错误。我希望下周推出另一个版本,如果你能把它放在问题清单上,我真的很感激。我道歉......
答案 1 :(得分:1)
SubSonic希望您的主键被称为Id,因此它变得混乱。 SubSonicPrimaryKey用于简单存储库,但我假设在不同模板之间共享抛出异常的位置。如果您将PK重命名为Id或id或ID,则查询将起作用。