实体框架存储过程 插入自定义序列号
本文关键字:自定义 序列号 插入 存储过程 框架 实体 | 更新日期: 2023-09-27 18:34:11
请耐心等待我是一个很长的解释。
我有一个在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 之前,请确保键值是唯一的。
有什么建议吗?
编辑存储过程示例
声明@nextNumber int
从位置 = @location 和 type=SEQUENTIAL_TABLE 中选择 @nextNumber = 值 + 1,然后选择 type=@type
插入到表中(位置、类型、ID ,......(值(@location、@type、@nextnumber、....(
更新SEQUENTIAL_TABLE设置值 = @nextNumber其中位置 = @location 和类型=@type
选择@nextNumber作为 [下一个号码]
在不了解有关设计的更多信息的情况下;您可以修改表,使 ID 不是主键,而是使用 ID/位置/Type 集作为组合键。
你误用了id列,而不仅仅是表示"自动递增int"。
"假负数"是一个很好的技巧,在 DataSet/TableAdapter 时代工作得很好。 如果这不起作用,也许这是一个竞争条件,您需要将详细信息放在事务中,以便在您完成递增和插入您的 id 之前,没有其他线程/行可以获取下一个 id。