Breeze - 当 PK 是自动生成的 ID 时无法创建实体

Posted

技术标签:

【中文标题】Breeze - 当 PK 是自动生成的 ID 时无法创建实体【英文标题】:Breeze - Can't Create Entity when PK is an autogenerated ID 【发布时间】:2019-02-07 13:50:25 【问题描述】:

当表的 PK 是用户输入的值时,我已经使用过几次轻量级的 CreateEntity。当 PK 是 IDENTITY 时,使用 SQL SERVER 有几次。当 PK 是 ORACLE 中自动生成的 ID(实际上是“序列”)时,这是我第一次尝试这样做。它不工作。

我首先检查以确保我已获取元数据,然后创建新的空实体,该实体将由用户填充值。

我的 createEntity 代码(newEntity 是可淘汰的 Observable):

function createEntity(newEntity) 
    newEntity(manager.createEntity(entityNames.escctransactions, ));   <<<<< this fails
    return;

错误: 如果不先设置其键或将其 entityType 'AutoGeneratedKeyType' 属性设置为 'None' 以外的值,则无法将 (ESCC_TRANSACTIONS:...) 类型的对象附加到 EntityManager

我知道我需要将 AutoGeneratedKeyType 设置为“Identity”,但不知道该怎么做。当我初始化元数据时尝试过这个,但仍然出现同样的错误,所以它显然不起作用:

   var entyType = manager.metadataStore.getEntityType("ESCC_TRANSACTIONS");
   entyType.setProperties( AutoGeneratedKeyType: AutoGeneratedKeyType.Identity );

我见过一些关于在构造函数中做的事情,但我从未在 javascript 中使用过构造函数。还有关于在配置中更改它的东西吗?

使用 Breeze 1.6、Knockout.js 3.4、.NET 4.5.2 框架

谢谢

【问题讨论】:

【参考方案1】:

我自己想通了,它现在可以工作了。设置 AutoGeneratedKeyType 的代码如下:

var entityType = manager.metadataStore.getEntityType("ESCC_TRANSACTIONS");
entityType.autoGeneratedKeyType = "Identity";

或者这行得通:

var entityType = manager.metadataStore.getEntityType("ESCC_TRANSACTIONS");
entityType.autoGeneratedKeyType = breeze.AutoGeneratedKeyType.Identity;

尽管此处有 AutoGeneratedKeyType 的 Breeze 文档: http://breeze.github.io/doc-js/api-docs/classes/AutoGeneratedKeyType.html,在Auto中不是大写的“A”,而是小写的“a”。

【讨论】:

以上是关于Breeze - 当 PK 是自动生成的 ID 时无法创建实体的主要内容,如果未能解决你的问题,请参考以下文章

调试breeze js实体状态

Django查询 – id vs pk

Breeze、OData 和无 EF

Breeze executeQuery Q 承诺失败 CORS

从 MySQL 中的现有表生成更改日志时,liquibase 如何处理自动递增的 PK?

当给定记录的级别是随机的时选择最高关联