3

我有一个表,它有一个由两个 int 字段和一个 varchar(50) 字段组成的复合键。我将复合键设为我的主键,而我通常不会这样做。是的,是的,是的,我对逻辑键与代理键的辩论非常熟悉,但我一定在我上桌的那天做了一些重药(不是真的),因为我采用了逻辑键方法使用代理(我几乎总是这样做)。

我的问题:LINQ 不允许我对作为复合键一部分的 varchar(50) 列进行更新。它抛出异常“属性‘值’是对象的关键信息的一部分,不能被修改。” 'Value' 是该字段的名称(请不要教我在列名中使用保留字......就像我已经说过的那样,那天我正在服用严重的药物)。

那么,除了在岩石和坚硬的地方之间,这给我留下了什么?有问题的表实际上确实有一个唯一的标识列(即使它不是主键),并且该列被用于另一个表的外键。所以,呃,我不能很容易地做一些黑客攻击,比如删除有问题的记录并重新添加它,因为这会迫使我跟踪其他表中的 fk,然后再重新添加它们。什么样的恶梦...

任何人都知道一个简单的方法来解决这个问题,而不会强迫我对我的表结构进行大量更改?

4

2 回答 2

3

如果您在该表上已经有一个唯一的 IDENTITY 列,那么它应该是您的主键。主键应该始终只能在表中最小大小的候选(唯一)键之间进行选择,并且应该几乎始终是不可变的。

您甚至不必将 IDENTITY 列设置为数据库上的 PRIMARY KEY,只需将其设置为 Linq to SQL 模型中的键列,一切都应该可以正常工作。

于 2010-06-03T20:59:36.467 回答
0

如果您尝试更新形成复合键的列,我会说您的表无论如何都已损坏,而损坏的不是 LINQ。告诉 LINQ 您的标识列是您的密钥,或者使用 SPROC 进行所需的更新。

于 2010-06-03T21:56:55.653 回答