4

当您在 EF 代码优先中设置 one:many 关系时,您可以选择它是否应该像这样在删除时级联:

modelBuilder.Entity<Assessment>()
    .HasRequired(asmt => asmt.CreatedByUser)
    .WithMany(usr => usr.Assessments)
    .HasForeignKey(asmt => asmt.CreatedByUserId)
    .WillCascadeOnDelete(true);

这转化为ON DELETE CASCADE外键定义的 SQL 部分,即。

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()。为什么不?

4

3 回答 3

2

实体框架通过导航属性处理关系,因此ON UPDATE CASCADE所有此类关系都已打开。

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

于 2012-12-04T15:38:28.680 回答
2

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

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

于 2012-12-08T18:32:06.913 回答
1

您不能更改主键。

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

于 2012-12-04T23:47:59.380 回答