WPF 火鸟主键冲突



在 WPF 项目中,我连接到 Model 的 Firebird 数据库,然后尝试将项插入到声明了主键的表中。

我收到此错误:

违反表上的主键或唯一键约束 \"PK_ARTI_1" "阿蒂"

有问题的键值为 (\"ID\" = 0)

我的火鸟表有这个 DDL:

CREATE TABLE ARTI
(
  ID Integer NOT NULL,
  NAME Varchar(100),
  DESCRIPTION Varchar(200),
  TAX Decimal(10,2) NOT NULL,
  CONSTRAINT PK_ARTI_1 PRIMARY KEY (ID)
);
ALTER TABLE ARTI ADD CONSTRAINT FK_ARTI_1
  FOREIGN KEY (IDTAX) REFERENCES TAX (ID) ON UPDATE NO ACTION ON DELETE NO ACTION;
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON ARTI TO  SYSDBA WITH GRANT OPTION;

此外,我还有一个用于自动增量ID的触发器(生成器),如下所示:

SET TERM ^ ;
ALTER TRIGGER ARTI_BI ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
  NEW.ID = GEN_ID(GEN_ARTI_ID, 1);
END^
SET TERM ; ^

(这是以不同的方式自动生成的,但我根据其他一些SO问题/答案剥离了一些代码)

如果我尝试通过实体框架保存项目,则会出现上述错误。我实际上不知道如何访问/查看实际的插入表,因为它是在实体框架的幕后完成的,但我绝对不会为 ID 字段分配任何值。

我的项目添加代码是这样的:

using (ArtEntities context = new ArtEntities())
{
            ARTI art = new ARTI();
            art.NAME = tbname.Text;
            art.DESCRIPTION = tbdesc.Text;
            art.TAX = decimal.Parse(cbTAX.Text);
            context.ARTIs.Add(art);
            context.SaveChanges();
            int idu = art.ID;
}

在最后一行中,我尝试获取插入行的 ID 值,但它没有到达那里。它停在实体框架可能正在执行数据库操作的SaveChanges()处。

表的模型 cs 文件如下所示:

---阿尔蒂

.cs ---
namespace TestXXX
{
    using System;
    using System.Collections.Generic;
    public partial class ARTI
    {
        public int ID { get; set; }
        public string NAME { get; set; }
        public string DESCRIPTION { get; set; }
        public decimal TAX { get; set; }
    }
}

我还必须提到,当我尝试向表中添加新项目时,该表是空的。因此,表中没有其他 ID 为 0 的值。

如何避免此错误?

在我看来,这似乎是某种错误?

新编辑我对触发器进行了更改,因此它期望 ID 值为 0,如下所示:

SET TERM ^ ;
ALTER TRIGGER ARTI_BI ACTIVE
BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE tmp DECIMAL(18,0);
BEGIN
  IF ((NEW.ID IS NULL)OR(NEW.ID = 0)) THEN
    NEW.ID = GEN_ID(GEN_ARTI_ID, 1);
  ELSE
  BEGIN
    tmp = GEN_ID(GEN_ARTI_ID, 1);
    if (tmp < new.ID) then
      tmp = GEN_ID(GEN_ARTI_ID, new.ID-tmp);
  END
END^
SET TERM ; ^

但是现在,当我做插入(EF)时,之后

        context.ARTIs.Add(art);
        context.SaveChanges();
        int idu = art.ID;

我使用消息框显示我的 ID,值始终为零 (0)。当我使用 FlameRobin 检查表格时,我可以在新行的 ID 字段中看到不同的数字。因此,EF 似乎确实执行了插入,但它没有返回实际插入的 ID,而是返回他发送到服务器的 ID......或者从我坐的地方看是这样。

如何在保存更改()后获取真实插入的ID?

我相信

这个问题的一个可能的解决方案是让我使用 UUID 而不是 ID。这样我就可以在插入之前生成它们,这样我就可以知道 UUID,而无需在插入后查询表 - 避免并发问题。

最新更新