【问题标题】:How do I remove a foreign key contraint without deleting and recreating a column如何在不删除和重新创建列的情况下删除外键约束
【发布时间】:2018-02-07 10:50:51
【问题描述】:

这是我的 UserLog 模型:

public class UserLog
{
    public int Id { get; set; }
    public ApplicationUser Customer { get; set; }
    public DateTime LogDate { get; set; }
}

我创建它是出于风险管理的目的。问题是每当我想从AspNetUsers 表中删除用户时,我必须首先从UserLog 中删除与用户关联的行。然而,这样做会破坏现有风险管理系统的整体理念。

有没有办法删除放置在 UserLog 表上的 FKConstraint?我知道如果我删除 ApplicationUser 并将 Customer 重命名为 Customer_Id 代码首先将删除该行和约束,然后重新创建它并为其赋予新名称(即使该行当前名为 Customer_Id)。有解决办法吗?

【问题讨论】:

  • 您是否尝试过让您的外键可以为空:stackoverflow.com/a/5668835/2048391 注意我还没有测试这将如何影响行的删除(所以请仅在测试环境中尝试,而不是在 prod 中)

标签: c# asp.net-mvc foreign-keys entity-framework-migrations


【解决方案1】:

alter table UserLog 删除约束 FKconstraintName;

【讨论】:

  • 通过 sql 执行此操作的唯一问题是,当我从测试到生产使用 update-database 时,不会包含该命令
【解决方案2】:

正如here 解释的那样,删除不应具有外键约束的实体并从数据库中更新是最简单的方法。

要回答您的问题,最难的方法是深入研究 EDMX 的 XML 并自己动手。

执行此操作的步骤,如链接中所述:

  1. 在概念模型中,移除 FK 属性,通常是 ChildId 之类的。
  2. 仍在概念模型中,将导航属性更改为单数。
  3. 再次在概念模型中,删除您的关联的ReferentialConstraint。假设您的协会名称类似于 FK_Child_Parent,只需将 ReferentialConstraint 转储到其中即可。请注意,如果需要,您也可以在此处设置多重性;您将在端点上设置正确的多重性。您的选项是 *、1 或 0..1。
  4. 现在向下移动到 C-S 映射内容(映射),并删除与您要删除的外键对应的 ScalarProperty
  5. 最后,由于您删除了ReferentialConstraint,您需要添加一个AssociationSetMapping。您可以将其附加到 XML 的 EntityContainerMapping 部分的末尾。下面,您可以找到AssociationSetMapping 的 sn-p。 请务必替换 AssociationSetMapping 中全部大写的属性

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多