当您在EF代码中设置一个:多个关系时,您可以选择是否应该像删除一样进行级联:
modelBuilder.Entity<Assessment>()
.HasRequired(asmt => asmt.CreatedByUser)
.WithMany(usr => usr.Assessments)
.HasForeignKey(asmt => asmt.CreatedByUserId)
.WillCascadeOnDelete(true);
这转换为外键定义的SQL ON DELETE CASCADE
部分,即
ALTER TABLE [dbo].[Assessment] WITH CHECK ADD CONSTRAINT [FK_dbo.Assessment_dbo.User_CreatedById] FOREIGN KEY([CreatedById])
REFERENCES [dbo].[User] ([UserId])
ON DELETE CASCADE
GO
但是,Fluent API中似乎没有类似的方法允许您控制ON UPDATE CASCADE
的值,即。像.WillCascadeOnUpdate()
这样的东西。为什么不呢?
答案 0 :(得分:2)
实体框架通过导航属性处理关系,因此ON UPDATE CASCADE
已经为所有这些关系打开了。
嗯,另一方面,我不确定您是否可以直接从实体框架更改实体的主键。
答案 1 :(得分:2)
嗯,显然答案是你应该从不更改ORM中的主键,即使DBMS支持更改主键。因为假设您永远不会更改主键,所以不需要实体框架来指定是否在更新时级联,因为这样的想法是主键更新永远不会发生。
但请注意,即使实体框架ORM不允许您这样做,这仍然可以在大多数数据库中手动完成。如果直接在数据库中手动执行主键更新,DBMS将仅使用其默认行为进行级联更新。
答案 2 :(得分:1)
您无法更改主键。
这通常是一种不好的做法,尤其是在使用ORM时。