我有一个表,它使用三列作为复合键。
其中一个列值用作有序相关记录的序列跟踪器。当我插入新记录时,我必须增加新记录之后的相关记录的序列号。
我可以直接在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.
有人可以建议解决这个限制吗?
(添加新记录(由错误消息建议)实际上不是一个选项,因为具有复合键的表与另一个表有关系。)
答案 0 :(得分:4)
更改主键是我书中的“代码味道”。
答案 1 :(得分:3)
我们实施的修复方法如下
答案 2 :(得分:1)
我通过使用SQL存储过程更新其中一个主键并从LINQ调用它来解决这个问题。
答案 3 :(得分:0)
我认为编译器是正确的。执行此操作的唯一方法是创建新记录并删除旧记录。
(添加新记录(如建议的那样) 错误信息)不是真的 选项作为具有复合的表 key与另一个有关系 表。)
我认为这没问题。只需复制实体的所有字段,设置新的序列,并通过将旧的EntitySet
引用分配给新的<{>}来设置任何关系。我试过这个并且它正确更新。
除此之外,您是否只能创建一个具有自动增量的新ID列?我同意@ocdecio。我认为改变主键是糟糕的设计......
答案 4 :(得分:0)
我不知道LINQ,但是如果您在SQL Server上为FK关系定义了级联更新,这会有用吗?
介意,我认为使用复合键是一个坏主意,改变一个是一个更糟糕的主意。主键不应该改变。如果主键发生变化,太多东西可能会被破坏。当主键发生变化并且它现在不是唯一的时,你会怎么做?如果你这样做,你将需要一种方法来处理它,因为它会发生。