【问题标题】:ASP.NET With Firebird database problemsASP.NET 与 Firebird 数据库问题
【发布时间】:2012-07-22 06:57:28
【问题描述】:

您是否尝试过使用 Firebird 数据库创建 ASP.NET MVC 项目...我尝试过,但很难..

我的问题:

  • 我有适用于 Visual Studio 2010 的 Firebird 提供程序。
  • 我有正确的数据库,其中包含增加表 ID 所需的一切。
  • 我创建了 ASP.NET MVC 3 项目,其中包含数据库(如 EDMX 文件)和实体。
  • 当我尝试向表中插入记录时,出现如下问题:

FirebirdSql.Data.Common.IscException:违反表“USERS”上的 PRIMARY 或 UNIQUE KEY 约束“PK_USERS”

这意味着创建的记录的 id 不会增加。 我有必须生成新 id 的存储过程。

我的问题是:
如何从 ASP.NET 向 Firebird 数据表中插入记录?

【问题讨论】:

    标签: asp.net-mvc entity-framework firebird edmx


    【解决方案1】:

    在 Firebird 中,如果您想要具有类似自动增量的行为,则需要将触发器与序列(生成器)结合使用。否则,您需要确保自己分配一个唯一的 id。

    创建序列:

    CREATE SEQUENCE mytable_id_sq;
    

    创建用于分配唯一 i 的触发器(在名为 mytable 的表上)

    set term !! ;
    CREATE TRIGGER T1_BI FOR mytable
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
    if (NEW.ID is NULL) then NEW.ID = NEXT VALUE FOR mytable_id_sq;
    END!!
    set term ; !!
    

    只有在INSERT 语句中没有分配 ID 时,此触发器才会分配生成的值。

    另请参阅: Firebird 2.5 语言参考中的SEQUENCE (GENERATOR) 部分和How to create an autoincrement column?(此链接讨论生成器,Firebird 中序列的旧名称)。

    【讨论】:

    • 我从一开始就有触发器和生成器。我的触发器看起来像:开始 if (new.user_id is null) then new.user_id = gen_id(gen_users_id,1); end 和我的发电机看起来像: begin id = gen_id(gen_employees_id, 1);暂停; end 这是给用户表的。
    • 那么很可能你的序列/生成器和表 id 不同步:序列返回一个已经存在于你的表中的值。如果您在不使用生成器的情况下插入自分配 ID,就会发生这种情况。
    • 或者,写很多触发器,你可以直接写:插入TABLE(ID,...)值(YOUR_GENERATOR的下一个值,...);
    • @Marcodor 假设所有编写 SQL 的开发人员都会表现自己;)
    【解决方案2】:

    您的 EDMX 可能没有正确生成。您必须手动设置 StoreGeneratedPattern 或使用 http://blog.cincura.net/230841-generated-primary-key-in-entity-framework-model-from-firebird/

    【讨论】:

    • 我尝试将 StoreGeneratedPattern 切换为 Computed 或 Identity,但不起作用。我只需在将用户添加到数据库之前添加此行即可解决问题:user.USER_ID = db.USERS.Max(x => x.USER_ID) + 1;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2010-12-17
    相关资源
    最近更新 更多