实体框架将所有字段放在 Firebird 表的主键中

Posted

技术标签:

【中文标题】实体框架将所有字段放在 Firebird 表的主键中【英文标题】:Entity Framework puts all fields in primary key for Firebird tables 【发布时间】:2013-02-14 23:29:54 【问题描述】:

我将 Firebird 2.1 数据库与 VS2010 (.NET 4.0) 一起使用,并试图让它与实体框架一起正常工作。

问题是,当我从数据库表生成实体时,框架会检测到所有列都是主键的一部分。该表非常简单,有两个整数列,其中一个被设置为主键。

我什至将“#PK_GEN#”设置为主键列的注释。

在 EF 编辑器中,我无法修改 store 对象的主键属性,因为我必须处理可为空的列,这是一个问题。我可以编辑模型文件的 XML 代码,但是更新模型时所做的更改是非持久性的,所以这是一个阻碍。

由于我只阅读了有关视图而非表格的类似问题,因此我显然做错了,但我无法弄清楚。

编辑:顺便说一句,我刚刚用 VS 2012 测试了行为,它保持不变。

这里是 CREATE 脚本。由于我是 Firebird 的新手,这里可能也有一些问题,但我真的不这么认为。

CREATE GENERATOR GEN_TESTTABLE_ID;
CREATE TABLE TESTTABLE (
    TESTTABLE_ID  INTEGER NOT NULL,
    VALUE         INTEGER
);
ALTER TABLE TESTTABLE ADD CONSTRAINT PK_TESTTABLE PRIMARY KEY (TESTTABLE_ID);
COMMENT ON COLUMN TESTTABLE.TESTTABLE_ID IS '#PK_GEN#';

SET TERM ^ ;
CREATE OR ALTER TRIGGER TESTTABLE_BI_GEN_ID FOR TESTTABLE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  if ((new.testtable_id is null) or (new.testtable_id = 0) ) then
    begin
      new.testtable_id = gen_id(gen_testtable_id, 1);
    end
end
^
SET TERM ; ^

【问题讨论】:

也许是个愚蠢的问题,但您将该列标记为自动生成(身份),但您是否也将其设为主键? 是的,我将一列设置为主键,如果需要,BeforInsert 触发器会生成一个新 ID。看起来像一个非常简单的表,就像我在 MS SQL Server 或 Oracle 中做的那样——除了 ID 是如何生成的。以防万一,我明天将 CREATE TABLE 语句添加到问题中...... 【参考方案1】:

问题是,Firebird 2.1 包含导致此问题的错误。使用 Firebird 2.5 生成模型就可以了。

一些参考here、here、here。

【讨论】:

感谢您的回答。我确实可以确认,Firebird 2.5 不会出现此问题。

以上是关于实体框架将所有字段放在 Firebird 表的主键中的主要内容,如果未能解决你的问题,请参考以下文章

MySQL外键约束-foreign key

MySQL外键约束-foreign key

Mysql的外键

关于oracle中 根据一个表的主键数据同步更新另一个关联表的字段。

可以使用实体框架在另一个表中调用两次作为外键的主键吗?

视图和实体框架