使用LINQ编辑复合键值

时间:2009-01-19 16:51:13

标签: c# .net sql-server linq

我有一个表,它使用三列作为复合键。

其中一个列值用作有序相关记录的序列跟踪器。当我插入新记录时,我必须增加新记录之后的相关记录的序列号。

我可以直接在SQL Server Management Studio中执行此操作,但是当我在LINQ中尝试此操作时,我收到以下错误:

Value of member 'Sequence' of an object of type 'TableName' changed.
A member defining the identity of the object cannot be changed.
Consider adding a new object with new identity and deleting the existing one instead.

有人可以建议解决这个限制吗?

(添加新记录(由错误消息建议)实际上不是一个选项,因为具有复合键的表与另一个表有关系。)

5 个答案:

答案 0 :(得分:4)

更改主键是我书中的“代码味道”。

答案 1 :(得分:3)

我们实施的修复方法如下

  • 删除了使用复合键的关系
  • 添加了自动增量ID字段,将其设置为主键
  • 为我们之前用作
  • 的三个字段添加了唯一约束
  • 使用之前我们主键的三个字段重新创建关系

答案 2 :(得分:1)

我通过使用SQL存储过程更新其中一个主键并从LINQ调用它来解决这个问题。

答案 3 :(得分:0)

我认为编译器是正确的。执行此操作的唯一方法是创建新记录并删除旧记录。

  

(添加新记录(如建议的那样)   错误信息)不是真的   选项作为具有复合的表   key与另一个有关系   表。)

我认为这没问题。只需复制实体的所有字段,设置新的序列,并通过将旧的EntitySet引用分配给新的<{>}来设置任何关系。我试过这个并且它正确更新。

除此之外,您是否只能创建一个具有自动增量的新ID列?我同意@ocdecio。我认为改变主键是糟糕的设计......

答案 4 :(得分:0)

我不知道LINQ,但是如果您在SQL Server上为FK关系定义了级联更新,这会有用吗?

介意,我认为使用复合键是一个坏主意,改变一个是一个更糟糕的主意。主键不应该改变。如果主键发生变化,太多东西可能会被破坏。当主键发生变化并且它现在不是唯一的时,你会怎么做?如果你这样做,你将需要一种方法来处理它,因为它会发生。