使用sequelize和MSSQL传播级联onDelete外键约束

时间:2018-01-23 17:08:18

标签: javascript sql-server foreign-keys constraints sequelize.js

我在使用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设置为请求模型中的用户的外键,但它不起作用。

有关我应该怎么做的任何建议?我需要实现删除公司删除其用户和请求。

0 个答案:

没有答案