Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF firebird主键冲突_C#_Wpf_Entity Framework_Firebird - Fatal编程技术网

C# WPF firebird主键冲突

C# WPF firebird主键冲突,c#,wpf,entity-framework,firebird,C#,Wpf,Entity Framework,Firebird,在WPF项目中,我连接到模型的Firebird数据库,然后尝试将一个项插入到其中一个声明了主键的表中 我得到这个错误: 违反表上的主键或唯一键约束“PK_ARTI_1” \“艺术” 有问题的键值为(\“ID\”=0) 我的Firebird表具有以下DDL: CREATE TABLE ARTI ( ID Integer NOT NULL, NAME Varchar(100), DESCRIPTION Varchar(200), TAX Decimal(10,2) NOT NULL,

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

我得到这个错误:

违反表上的主键或唯一键约束“PK_ARTI_1” \“艺术”

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

我的Firebird表具有以下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问题/答案剥离了一些代码)

如果我试图通过实体框架保存一个项目,就会出现上述错误。我实际上不知道如何访问/查看实际的insert表,因为它是在实体框架的后台完成的,但我肯定不会给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文件如下所示:

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 ; ^
---艺术中心---

我还必须指出,当我尝试向表中添加新项时,表是空的。因此,表中没有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 ; ^
我使用MessageBox显示我的ID,并且该值始终为零(0)。当我使用FlameRobin检查表时,我可以在我的新行的ID字段中看到一个不同的数字。因此,EF似乎确实执行了插入,但它不返回实际插入的ID,而是返回他发送给服务器的ID。。。从我坐的地方看似乎是这样


如何在SaveChanges()之后获得实际插入的ID?

我认为解决这个问题的可能方法是使用UUID而不是ID。这样,我可以在插入之前生成它们,这样我就可以知道UUID,而不必在插入之后查询表,从而避免了并发问题。

我尝试手动(FireRobin)将一条记录插入表中(不指定ID),结果成功了。为什么它不能从wpft开始工作
int
的默认值是
0
,因此它不会以
null
的形式输入触发器。但是,我将触发器更改为ID为0以及NULL,但是,当我插入一条新记录并在SaveChanges()之后请求它返回时,即使直接查看表,我发现插入的ID有所不同,我仍然得到了0。因此,基本上,我使用EF在表中插入一个新行,我没有为ID赋值,插入正常,但是EF告诉我插入值的ID是0(不是)。如何获取插入的实际ID?使用SQL Server,EF在插入后立即查询范围\ U标识。我假设Firebird数据提供程序也做了类似的事情,但它可能不会获取修改后的值。您应该检查已执行的SQL语句,以了解并可能得到如何解决该问题的提示。如何检查已执行的SQL语句?我对WPF实体框架和WPF一般都是新手。请详细说明
        context.ARTIs.Add(art);
        context.SaveChanges();
        int idu = art.ID;