我有一个包含两个int字段和一个varchar(50)字段的复合键的表。我将复合键设为主键,我通常不会这样做。是的,是的,是的,我不仅仅熟悉逻辑密钥与代理密钥的争论,但是自从我采用逻辑密钥方法以来,我必须做了一些重要的药物(不是真的)。使用代理人(我几乎总是这样做)。
我的问题:LINQ不允许我对作为复合键一部分的varchar(50)列进行更新。它抛出异常“属性'值'是对象的关键信息的一部分,无法修改。” “价值”是该字段的名称(请不要指导我使用保留字来表示列名...就像我已经说过的那样,我当时正在服用严重的药物。)
除了岩石和坚硬的地方之外,这又是什么呢?有问题的表实际上确实有一个唯一的标识列(即使它不是主键),并且此列正在另一个表的外键中使用。所以,呃,我不能轻易做一些黑客,比如删除有问题的记录并重新添加它,因为这会迫使我跟踪其他表中的fk,然后重新添加它们。多么噩梦......
任何人都知道在不强迫我对表结构进行大量更改的情况下解决此问题的简单方法吗?
答案 0 :(得分:3)
如果该表上已有唯一的IDENTITY列,那么它应该是您的主键。主键应该始终只能在表中最小大小的候选(唯一)键之间进行选择,并且几乎总是应该是不可变的。
您甚至不必将IDENTITY列作为数据库上的PRIMARY KEY,您可以将其作为Linq to SQL模型中的键列,并且一切都应该正常工作。
答案 1 :(得分:0)
如果您正在尝试更新形成复合键的列,我会说您的表无论如何都会被破坏,而且不是LINQ被破坏了。告诉LINQ您的标识列是您的密钥,或使用SPROC进行所需的更新。