我在使用 SubSonic 3 和多个主键列时遇到问题。ActiveRecord T4 脚本似乎不支持它。
在 Settings.ttinclude 的第 173 行
return this.Columns.SingleOrDefault(x=>x.IsPK) ?? this.Columns[0];
它尝试获取单个主键列并失败。
有什么解决办法吗?
我在使用 SubSonic 3 和多个主键列时遇到问题。ActiveRecord T4 脚本似乎不支持它。
在 Settings.ttinclude 的第 173 行
return this.Columns.SingleOrDefault(x=>x.IsPK) ?? this.Columns[0];
它尝试获取单个主键列并失败。
有什么解决办法吗?
我将调整模板以在将来添加对此的支持(因为很多人都遇到了问题),但您可以更改它:
return this.Columns.SingleOrDefault(x=>x.IsPK) ?? this.Columns[0];
对此:
return this.Columns.Where(x=>x.IsPK).ToArray();
(这是徒手的),然后将返回类型更改为 Column[]。从这个角度来看,更改应该非常简单,但是您需要从头到尾更改模板。
我知道人们喜欢复合键——它们对很多人来说特别重要,但是(我认为)我不喜欢这种设计。一个表(不是很多/很多)应该有一个 PK 来唯一标识一行......
我也明白很多人无法控制这样的事情:)。无论如何-如果您想帮助并分叉/推动它,我将非常感激。
许多 ORM 产品不支持复合键,因为这样做非常复杂。据我所知,NHibernate 是唯一有名的 .Net ORM 产品。
Mindscape 正在讨论对他们的 Lightspeed 产品版本 3 的复合键支持,但我对此知之甚少。
SubSonic 目前不支持复合键。
我相信EntitySpaces确实支持它们。
我的 2cents-
- 这是为了回答 womp 只是说 NHibernate 不是唯一众所周知的支持复合键的 ORM。至少在投票时发表评论(或侮辱 :p )-
您可能会创建一个视图,该视图通过连接复合键列来创建主键。例如,如果它们是 varchar 列 PK = COALESCE(K1, '|', K2, '|', K3)。如果它们是数字,您可以通过将每个键列乘以乘数来创建唯一的 PK 来执行类似的操作。