为什么没有等同于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时。