实体框架存储过程 插入自定义序列号

本文关键字:自定义 序列号 插入 存储过程 框架 实体 | 更新日期: 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。