我在使用MSSQL db上的Sequelize创建外键onDelete约束时遇到问题。
这是我的用例:每个公司可以拥有多个用户,这些用户可以创建多个请求。可以在不引用用户的情况下创建一些请求,这就是我在请求模型中同时引用公司和用户的原因。我希望在删除公司后实现这一目标,公司的所有用户都将被删除,并且公司的所有请求都将被删除。
这些是我在Sequelize中定义的模型:
公司型号:
const CompanyModel = sequelize.define('company', {
... some props ...
});
CompanyModel.associate = function (models) {
CompanyModel.hasMany(models.user, {
as: 'users',
foreignKey: 'companyId',
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
});
CompanyModel.hasMany(models.request, {
as: 'requests',
foreignKey: 'companyId',
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
});
};
用户模型:
const UserModel = sequelize.define('user', {
... some props ...
});
UserModel.associate = function (models) {
UserModel.belongsTo(models.company, {
as: 'company',
foreignKey: 'companyId',
});
UserModel.hasMany(models.request, {
as: 'requests',
foreignKey: 'userId',
});
};
请求型号:
const RequestModel = sequelize.define('request', {
... some props ...
});
RequestModel.associate = function (models) {
RequestModel.belongsTo(models.company, {
as: 'company',
foreignKey: 'companyId',
});
RequestModel.belongsTo(models.user, {
as: 'user',
foreignKey: 'userId',
});
};
然而,当我尝试同步我的数据库时,这是我得到的错误:
RequestError: Could not create constraint or index. See previous errors
'IF OBJECT_ID(\'[request]\', \'U\') IS NULL CREATE TABLE [request] ([id] CHAR(36) , ... some props ..., [companyId] CHAR(36) NULL, [userId] CHAR(36) NULL, PRIMARY KEY ([id]), FOREIGN KEY ([companyId]) REFERENCES [company] ([id]) ON DELETE CASCADE, FOREIGN KEY ([userId]) REFERENCES [user] ([id]) ON DELETE SET NULL);'
如果我在请求模型中评论与用户的关系,则会同步数据库。如果我在公司模型中为用户评论删除外键约束,就会发生同样的事情。请求的外键约束无关紧要。我想,问题是删除公司会删除可能是请求创建者的用户。逻辑是这些请求也将被删除,但数据库无法知道来自同一公司的用户(将被删除)是否也是该公司删除的请求的所有者。
我也尝试将allowNull
设置为请求模型中的用户的外键,但它不起作用。
有关我应该怎么做的任何建议?我需要实现删除公司删除其用户和请求。