我有一个与下面的代码相似的多对多关系模型。 VendorEmployeeModel
代表一个联接表,但是除非他们签署并把他们的Employee
记录链接到他们的Employee
记录,否则不一定会有VendorEmployee
记录(卖方可能只是创建VendorEmployee
记录以跟踪每个Employee
当前正在做什么。鉴于VendorEmployeeModel
代表的不只是一个联接表,我不使用BelongsToMany
装饰器。
我在整个代码库中使用BelongsTo
和HasMany
装饰器,没有问题。似乎唯一不同的是,Vendor
可以有很多VendorEmployees
,而VendorEmployee
可以有很多Vendors
(可以将其看作是场景)。
我在这里看到的错误是:
TypeError: Cannot read property 'name' of undefined
at Object.getForeignKeyOptions (node_modules/sequelize-typescript/dist/associations/foreign-key/foreign-key-service.js:24:40)
at HasAssociation.getSequelizeOptions (node_modules/sequelize-typescript/dist/associations/has/has-association.js:17:52)
at associations.forEach.association (node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:49:45)
at Array.forEach (<anonymous>)
at models.forEach.model (node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:48:26)
at Array.forEach (<anonymous>)
at Sequelize.associateModels (node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:44:16)
at Sequelize.addModels (node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:36:14)
at new Sequelize (node_modules/sequelize-typescript/dist/sequelize/sequelize/sequelize.js:18:22)
at SequelizeConnection.initialize (src/common/infrastructure/sequelize.ts:30:21)
at DatabaseTestFrameworkSimple.<anonymous> (test/framework/database.ts:74:24)
at test/framework/database.ts:8:71
at Promise._execute (node_modules/bluebird/js/release/debuggability.js:427:9)
at Promise._resolveFromExecutor (node_modules/bluebird/js/release/promise.js:518:18)
at new Promise (node_modules/bluebird/js/release/promise.js:103:10)
at Object.<anonymous>.__awaiter (test/framework/database.ts:4:12)
at DatabaseTestFrameworkSimple.initializeTestDb (test/framework/database.ts:71:16)
at DatabaseTestFrameworkSimple.<anonymous> (test/framework/database.ts:98:16)
at fulfilled (test/framework/database.ts:5:58)
at tryCatcher (node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (node_modules/bluebird/js/release/promise.js:547:31)
at Promise._settlePromise (node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (node_modules/bluebird/js/release/promise.js:729:18)
at _drainQueueStep (node_modules/bluebird/js/release/async.js:93:12)
at _drainQueue (node_modules/bluebird/js/release/async.js:86:9)
at Async.Object.<anonymous>.Async._drainQueues (node_modules/bluebird/js/release/async.js:102:5)
at Immediate.Async.drainQueues [as _onImmediate] (node_modules/bluebird/js/release/async.js:15:14)
除了该主要错误外,我还看到了SequelizeUniqueConstraintError: Validation error
和TypeError: Cannot read property 'query' of undefined
。如果删除VendorEmployee
和Vendor
BelongsTo / HasMany
装饰器,则一切正常(存储库中的其他包含项)。
代码如下:
@Table({
tableName: 'VendorEmployee'
})
export default class VendorEmployeeModel extends Model<VendorEmployeeModel> {
@Default(() => IdUtility.generateUid())
@Column
uid!: string;
@ForeignKey(() => VendorModel)
@Column
vendorId!: number;
@BelongsTo(() => VendorModel)
vendor: VendorModel;
@ForeignKey(() => EmployeeModel)
@Column
employeeId: number;
@BelongsTo(() => EmployeeModel)
employee: EmployeeModel;
@IsEmail
@Column
email: string;
@Column
phone!: string;
@Column
firstName!: string;
@Column
lastName!: string;
}
@Table({
tableName: 'Vendor'
})
export default class VendorModel extends Model<VendorModel> {
@Unique
@Default(() => IdUtility.generateUid())
@Column
uid: string;
@HasMany(() => VendorEmployeeModel)
vendorEmployees: VendorEmployeeModel[];
}
@Table({
tableName: 'Employee'
})
export default class EmployeeModel extends Model<EmployeeModel> {
@Unique
@Default(() => IdUtility.generateUid())
@Column
uid: string;
@Unique
@Column
userUid: string;
@HasMany(() => VendorEmployeeModel)
carrierDriver: VendorEmployeeModel[];
}
版本: