Breeze-Sequelize 使用 autoGeneratedKeyType 标识

Breeze-Sequelize with autoGeneratedKeyType Identity

我正在尝试使用 breeze-breeze sequelize 创建一个 MS SQL 数据库,我想在数据库服务器上生成 ID。我的解决方案基于 breeze 示例 repo

中的 tempHire 示例

我的 Metadata.json 看起来像这样:

{
    "metadataVersion": "1.0.5",
    "namingConvetion": "camelCase",
    "localQueryComparisonOptions": "caseInsensitiveSQL",
    "dataServices": [{
        "serviceName": "breeze/",
        "hasServerMetadata": true,
        "useJsonp": false
    }],
    "structuralTypes": [{

        "shortName": "User",
        "namespace": "Model",
        "autoGeneratedKeyType": "Identity",
        "defaultResourceName": "Users",
        "dataProperties": [{
            "nameOnServer": "id",
            "dataType": "Int32",
            "isPartOfKey": true,
            "isNullable": false
        }, {
            "name": "firstName",
            "dataType": "String"
        }, {
            "name": "lastName",
            "dataType": "String"
        }, {
            "name": "userName",
            "dataType": "String",
            "isNullable": false,
            "maxLength": 64,
            "validators": [{
                "name": "required"
            }, {
                "maxLength": 64,
                "name": "maxLength"
            }]
        }, {
            "name": "email",
            "dataType": "String"
        }]
    }],
    "resourceEntityTypeMap": {
        "Users": "User:#Model"
    }
}

尽管这不会创建身份 ID 列。 创建的 table 类似于以下创建脚本:

CREATE TABLE [User] (
    [id] INTEGER NOT NULL , 
    [firstName] NVARCHAR(255) DEFAULT NULL, 
    [lastName] NVARCHAR(255) DEFAULT NULL, 
    [userName] NVARCHAR(64) NOT NULL DEFAULT '', 
    [email] NVARCHAR(255) DEFAULT NULL, 
    PRIMARY KEY ([id])
)

此外还有一些 breeze 服务器端实现:

var dbConfig = {
    user: 'user',
    password: 'secret',
    dbName: 'dbname'
};

var sequelizeOptions = {
    host: 'hostname',
    dialect: 'mssql',
    port: 1433
};

function createSequelizeManager() {
    var metadata = readMetadata();
    var sm = new SequelizeManager(dbConfig, sequelizeOptions);
    sm.importMetadata(metadata);

    return sm;
}

var _sequelizeManager = createSequelizeManager();

_sequelizeManager.authenticate();

_sequelizeManager.sync(false /* createDb */)
    .then(seed)
    .then(function () {
        console.log('db init successful');
    });

我配置有误吗? Identity 不适用于 mssql 方言吗?难道我做错了什么?

我猜配置没有错。 我刚发现 breeze-sequelize 的 MetadataMapper 中有一个错误。我用 sequelize 版本 2.1.3 和 3.x.

测试了它

永远不会设置 sequelize 的 autoIncrement 属性。 if 语句永远不会为真。我将在 github 上报告此事。 ;)

修复方法是 MetadataMapper.js134 中的以下代码:

  if (attributes.type.key == "INTEGER" || attributes.type.key =="BIGINT") {
    attributes.autoIncrement = true;
  }

在原始代码中,if 语句是 attributes.type== "INTEGER" || attributes.type=="BIGINT",其中类型实际上从来不是字符串。