【问题标题】:Insert number id into primary key column using Typeorm EntityManager API使用 Typeorm EntityManager API 将数字 id 插入主键列
【发布时间】:2021-03-23 03:25:00
【问题描述】:

我正在尝试使用 Typeorm 将数字 id 插入 User 表的主列以构建 graphql 解析器,但得到错误

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“用户”中的标识列插入显式值。

我试过set identity_insert on,但没有成功

await em.query("SET IDENTITY_INSERT User ON")
await em.create(User, newUser)

有人建议将这两个查询合并到在线,但我不知道如何在 Typeorm 中进行。 我知道可以编写原始查询来组合它们。我想知道是否有一种优雅的方式来做到这一点?

【问题讨论】:

    标签: javascript sql-server typeorm graphql-js


    【解决方案1】:

    您需要在事务中执行命令。

    const em = getManager();
    await em.transaction(async transactionalEntityManager => {
        await transactionalEntityManager.query("SET IDENTITY_INSERT User ON");
        await transactionalEntityManager.create(User, newUser);
        await transactionalEntityManager.query("SET IDENTITY_INSERT User OFF");
    });
    

    【讨论】:

    • 谢谢。当我调用 save() 时,我仍然遇到同样的错误。这可能是 MS SQL 服务器问题,因为我可以使用您的代码创建,但是当我尝试将用户保存到 ms sql 服务器时出现错误。
    • 那么,您要创建或更新还是两者兼而有之?
    • 我正在尝试在创建新用户后保留新用户,如下所示:await transactionalEntityManager.query("SET IDENTITY_INSERT User ON"); const user = await transactionalEntityManager.create(User, newUser); await transactionalEntityManager.save(user); await transactionalEntityManager.query("SET IDENTITY_INSERT User OFF"); 如果我只通过调用 create 创建用户。新用户不会被持久化到 mssql 数据库中。
    【解决方案2】:

    不幸的是,我的解决方案是编写原始 sql:

    await em.query("SET IDENTITY_INSERT User ON;" + 
    "insert into user(id, firstname, lastname, username, password) " +
    "values(@0, @1, @2, @3, @4)", [variables...]
    

    希望这个解决方案可以帮助使用 Typeorm 和 MS SQL 服务器的人。

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多