0

我有 3 个表格(类别、文章和文章类别)。ArticleCategories 有一个组合的 PK 和 concists:

  1. ArticleID (PK, FK, int)
  2. 类别 ID(PK、FK、int)

现在,当我使用亚音速寻呼方法时,我遇到了一些非常奇怪的行为。它返回的记录数量是我预期的两倍(2 PK?)。通过完全删除分页或添加名为 ArticleCategoryID 的 PK 字段来解决此问题。

        SubSonic.Query qry = new SubSonic.Query(DAL.ArticleCategory.Schema);
        qry.AddWhere(DAL.ArticleCategory.Columns.CategoryID, filterid);

        //Pagesize
        qry.PageSize = Classes.Settings.PageSizes.GetAdminPageSize();

        //Pageindex
        if (pageindex > 0)
            qry.PageIndex = pageindex;
        else
            qry.PageIndex = 1;

上面的代码适用于所有其他表,但由于多对多关系而失败。我可以求助于添加额外的(和单一的)PK 字段,但这感觉不对。

也许我在这里遗漏了一些明显的东西,所以我提前为此道歉:)

谢谢你的时间亲切的问候,马克

4

1 回答 1

0

您也可以在这个问题中阅读 Rob Conery 的答案——它是关于 SubSonic 3,但由于它说 Rob 认为多对多表应该有一个单列主键来唯一标识任何表中的一行,我不不认为他在 SubSonic 2 中实现了复合键支持。

我个人总是在多对多表中添加一个 PK 列,因为它简化了很多 CRUD 代码。对我来说感觉是对的——如果你能做到,我建议你去。

我找不到官方文档,但我也记得(并且遇到了问题......)应该始终使用 PK 列作为视图中的第一列,否则分页无法正常工作。

分页问题也可能取决于数据库版本。例如,使用 SQL Server 2000 的分页实现是一种 hack(表变量等),因为 SQL Server 中缺乏适当的指令。以后的 DB 版本提供了更好的方法来实现分页,并且可能不依赖于单列 PK。

最后,不是真的关于这个问题,还是个人偏好:我尽量避免SubSonic.Query使用SubSonic.SQLQuery。SqlQuery 是后来添加的,比 Query 更好(另见这个问题

于 2011-03-26T14:09:29.747 回答