为什么没有等同于WillCascadeOnDelete的更新?

当你在EF代码中设置一个:多个关系时,你可以选择它是否应该像删除一样级联:

modelBuilder.Entity() .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()这样的东西。 为什么不?

entity framework通过导航属性处理关系,因此ON UPDATE CASCADE已经为所有这些关系打开。

嗯,另一方面,我不确定您是否可以直接从entity framework更改实体的主键。

好吧,显然答案是你不应该更改ORM中的主键,即使DBMS支持更改主键。 因为假设您永远不会更改主键,所以不需要entity framework来指定是否在更新时级联,因为这样的想法是主键更新永远不会发生。

但请注意,即使entity frameworkORM不允许您这样做,这仍然可以在大多数数据库中手动完成。 如果直接在数据库中手动执行主键更新,DBMS将仅使用其默认行为进行级联更新。

您无法更改主键。

总的来说这是一种不好的做法,尤其是在使用ORM时。