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.js
行 134
中的以下代码:
if (attributes.type.key == "INTEGER" || attributes.type.key =="BIGINT") {
attributes.autoIncrement = true;
}
在原始代码中,if 语句是 attributes.type== "INTEGER" || attributes.type=="BIGINT"
,其中类型实际上从来不是字符串。
我正在尝试使用 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.js
行 134
中的以下代码:
if (attributes.type.key == "INTEGER" || attributes.type.key =="BIGINT") {
attributes.autoIncrement = true;
}
在原始代码中,if 语句是 attributes.type== "INTEGER" || attributes.type=="BIGINT"
,其中类型实际上从来不是字符串。