【发布时间】:2012-05-15 20:47:27
【问题描述】:
请耐心等待我的解释很长。
我在 EF4 中设置了一个表,使用映射存储过程插入数据。
例子:
id | location | type
1 | 10 | 15
5 | 10 | 16
SP 所做的是在另一个表中检查与位置和类型相对应的下一个 id。
所以在这个例子中,下一个 id 是
- 2 用于位置 10 和类型 15
- 6 用于位置 10 类型 16
这通过在 EF 中映射结果列来实现。
它可以正常工作,除非两个不同的键具有相同的序列号示例:
id | location | type
1 | 10 | 11
1 | 10 | 10
编辑:当我同时创建两个新行时会发生此错误。
它们的下一个值是 2,数据保存到数据库但应用程序失败并显示以下消息:
对数据库的更改已成功提交,但发生错误 同时更新对象上下文。 ObjectContext 可能位于 状态不一致。
内部异常消息:
AcceptChanges 无法继续,因为对象的键值与另一个键值冲突 ObjectStateManager 中的对象。
在调用 AcceptChanges 之前确保键值是唯一的。
有什么建议吗?
编辑 存储过程示例
声明@nextNumber int
SELECT @nextNumber = value + 1 FROM SEQUENTIAL_TABLE WHERE location = @location and type=@type
INSERT INTO TABLE(位置、类型、id ......)值(@location、@type、@nextnumber、......)
UPDATE SEQUENTIAL_TABLE SET value = @nextNumber WHERE location = @location and type=@type
选择 @nextNumber 作为 [NextNumber]
【问题讨论】:
-
尝试将伪造的否定键分配给新实体。像 -1、-2 这样 EF 可以将它们分开。
标签: c# .net entity-framework-4