【问题标题】:SubSonic 3 and multiple PK columnsSubSonic 3 和多个 PK 列
【发布时间】:2009-07-26 02:36:28
【问题描述】:

我在使用 SubSonic 3 和多个主键列时遇到问题。 ActiveRecord T4 脚本似乎不支持它。

在 Settings.ttinclude 的第 173 行

return this.Columns.SingleOrDefault(x=>x.IsPK) ?? this.Columns[0];

它尝试获取单个主键列但失败了。

有什么解决办法吗?

【问题讨论】:

    标签: .net subsonic subsonic3 primary-key t4


    【解决方案1】:

    许多 ORM 产品不支持复合键,因为这样做非常复杂。据我所知,NHibernate 是唯一有名的 .Net ORM 产品。

    Mindscape 正在讨论对其 Lightspeed 产品第 3 版的复合键支持,但我对此了解不多。

    SubSonic 目前不支持复合键。

    【讨论】:

    • Linq-to-SQL 支持复合键,实际上需要它们进行多对多映射。
    【解决方案2】:

    我会调整模板以在未来添加对此的支持(因为很多人都遇到了问题),但您可以更改:

    return this.Columns.SingleOrDefault(x=>x.IsPK) ?? this.Columns[0];
    

    到这里:

    return this.Columns.Where(x=>x.IsPK).ToArray();
    

    (这是徒手的)然后将返回类型更改为 Column[]。从这个角度来看,更改应该非常简单,但是您需要从头到尾更改模板。

    我知道人们喜欢复合键 - 它们对许多/许多特别重要,但(我认为)我不喜欢这种设计。一个表(不是很多/很多)应该有一个 PK 来唯一标识一行...

    我也明白很多人无法控制这样的事情:)。无论如何 - 如果你想帮忙并分叉/推送这个,我真的很感激。

    【讨论】:

    • 刚刚看到这个问题的痛苦(尝试修复模板),我建议:使用 NHibernate 或使用单个 PK。更改上面的代码行是在浪费你的时间:它仍然不会做你想要的。
    • 我尝试修改模板但它不起作用,它也需要修改 SubSonic 中的许多类。我可以说这是最糟糕的时间,放下 SubSonic 并使用 NHibernate。
    【解决方案3】:

    您可能会创建一个视图,该视图通过连接复合键列来创建主键。例如如果它们是 varchar 列 PK = COALESCE(K1, '|', K2, '|', K3)。如果它们是数字,您可以通过将每个键列乘以一个乘数来执行类似的操作,以创建一个唯一的 PK。

    【讨论】:

    • 是的,这是一个 hack - 我只是在你真的被卡住的情况下才提出它。但是,我也会将具有多个 PK 的表称为 hack。
    【解决方案4】:

    我相信EntitySpaces 确实支持他们。

    我的 2cents-

    -- 这是为了回答 womp 只是说 NHibernate 不是唯一众所周知的支持复合键的 ORM。投票时至少留下评论(或侮辱 :p )--

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多