[entity framework core] Referential Constraint Action Options
link: https://www.learnentityframeworkcore.com/relationships/referential-constraint-action-options
我的理解是, 当你对数据库中的某个数据进行更新或者删除操作时, 对这个数据关联的数据如何操作的设置.
为了能够更好的理解, 首先搞两个表:
根据图示, author 表中的 author id 是作为 books 表中的外键存在的. 在设置 books 表的外键时的sql 语句为:
CONSTRAINT [FK_Books_Authors_AuthorId] FOREIGN KEY ([AuthorId]) REFERENCES [Authors] ([AuthorId])
也就是说当设置外键时, 我们需要指定一下, 当 Author 表中的 record 被 update 或者 delete 时, books 表中相关联的数据的值如何进行联动的设置.
ef core 提供了四个设置, 分别是以下:
- on update/delete no action
这个设置是默认的, 举个例子就是当你删除 author 表中的某个 author 记录时, 如果你不先将 books 表中外键为该 author 的数据先删除, 你就不能去删除 author 表里这条记录.
- on update/delete restrict
这个设置是需要开发者手动指定, 但是其作用和 no action 类似, 两者的区别在于外键约束的检查顺序不同. restrict 会先检查你要删除的 author 的 record 是否在 books 表中有关联的数据, 如果有, 就不删除 author. 但是 no action 是先删除 author 的 record, 然后拿着 author id 去 books 表中查是否有关联的数据, 如果有, 就需要回滚刚才删除的操作. 这是两者的区别.
- on update/delelte set null
这个比较简单, 就是你删除 author 时, 相关的 book 记录的 author 列会被赋值为 null, 前提是 author 这一列必须是 nullable.
- on update/delete set default value
这个设置和 set null 差不多, books 表中的 author 列需要被设置了 default value, 如果没设置, 需要是 nullable 的, 此时 default value 为 null.