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

时间:2012-12-04 15:29:14

标签: c# .net entity-framework ef-code-first

当您在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()这样的东西。为什么不呢?

3 个答案:

答案 0 :(得分:2)

实体框架通过导航属性处理关系,因此ON UPDATE CASCADE已经为所有这些关系打开了。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您无法更改主键。

这通常是一种不好的做法,尤其是在使用ORM时。