在软删除时更新外键

时间:2019-04-15 09:57:17

标签: c# sql foreign-keys

我的数据库中有2行。 CategoryMovie

当我软删除Movie时,我想删除对Category的FK引用。

我有一个如下删除方法:

        public override async Task DeleteAsync(long id, bool permanent = false)
        {
            await DbFactory.ExecAsync(async (db) =>
            {
                if (permanent)
                {

                    await db.DeleteAsync<Movie>(x => x.Id == id);
                }
                else
                {
                    await db.UpdateAsync<Movie>(new { Deleted = true, CategoryId = 0 }, x => x.Id == id);
                }
            });
        }

但是当我尝试更新CategoryId

时,它将引发FK异常

我该怎么做? 我希望能够软删除Movie,然后仅在类别没有任何引用的情况下才能删除该类别。

2 个答案:

答案 0 :(得分:0)

是否存在CategoryId = 0的条目?可能没有,这就是为什么您遇到错误。这里有两种方法:

  1. 创建一个虚拟的“已删除”类别,其ID = 0(我个人比较喜欢-1),在轻度删除时对其进行更新

  2. 如果该字段允许CategoryId,则将NULL设置为NULLs。这意味着此记录与类别无关。

答案 1 :(得分:0)

如果我是你,这些就是步骤

  1. 检查是否有Any个电影具有相同的类别ID,但ID与要删除的电影不同

  2. 如果是,则仅删除电影

  3. 如果没有,则删除类别和级联(如果不可能,则先删除电影,然后再删除类别)

还有一个并发问题要处理。如果有两个类别的电影又被同时删除怎么办?这可能会导致以下问题:在不同线程中删除了影片,并且两个线程都检查是否还有其他影片,并且对于每个影片,在删除之前都找到了另一个影片。为了应对这种情况,我建议创建某种删除电影队列,当要删除电影时,它将进入队列。这种顺序删除影片的方式将解决并发问题。