【问题标题】:Why is there no update equivalent to WillCascadeOnDelete?为什么没有与 WillCascadeOnDelete 等效的更新?
【发布时间】:2012-12-04 15:29:14
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您不能更改主键。

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

        【讨论】:

        • 如果 PK 是非身份字段,比如 GUID,该怎么办?您可以将其更改为另一个 GUID...
        • 还是错了。 PK 应该是不可变的。如果它发生变化,则说明您选择了错误的字段。
        • 我把你推荐给this answer。有时您可能需要更改主键。
        • 否,出现问题是因为选择了错误的 PK。 PK 永远不应该有商业意义。仅仅因为某些数据库支持 ON UPDATE CASCADE 概念并不意味着它是一个好主意。
        • 这并不意味着你应该使用它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多