【问题标题】:Entity Framework : how to change foreign key one field to another实体框架:如何将外键一个字段更改为另一个字段
【发布时间】:2018-03-24 22:32:05
【问题描述】:

我有一个 EF 问题要问你:我有这两门课

public class Post 
{
    public long Id {get;set}
    public string Content {get;set;}
    public virtual ICollection<Comment> Comments {get;set;}
}

public class Comment 
{
    public long Id {get;set;}
    public string Content {get;set;}
}

我首先用这些列创建了一个数据库,EF 用Post 类的Id 列创建了外键,但后来我添加了UniqKey 列作为我的新主键:

public class Post 
{
    public long Id {get;set}
    public string Content {get;set;}

    public string UniqKey {get;set;} //New Field will be my new primary key

    public virtual ICollection<Comment> Comments {get;set;}
}

我想将我的外键更改为使用UniqKey 而不是Id

我想在不删除和丢失任何数据的情况下更新数据库。

任何帮助表示赞赏

谢谢

【问题讨论】:

  • 我假设 UniqKey 实际上不会成为新的 primary 键?如果您希望Post 引用UniqKey:在 EF6 中无法完成。 EF-core 允许备用键。
  • 旧数据无法自动迁移,因为旧 FK 的类型为 long,您必须在添加新 PK 值后手动迁移数据(并在获取数据)。这不能在任何现有的初始化策略中完成,您必须配置一个策略为 null 的更新上下文。如果新属性实际上不应该是 FK,则您必须在每个查询中手动进行连接,因为 FK 引用 PK 列。

标签: c# asp.net entity-framework entity-framework-6


【解决方案1】:

您应该首先对数据库进行操作(如果您使用 SQLserver,可以使用管理工作室,或者在这种情况下首选 Toad)。

首先备份数据库。

然后添加允许为 null 的列 UniqKey。

现在更新表并手动添加 UniqKey 的值。

移除与 Id 相关的约束和键。

将允许的 null 删除到 Uniqkey 并为其添加约束和键。

在您的模型中添加属性 [Key] 和 [DatabaseGenerated(DatabaseGeneratedOption.None)]

别忘了你也必须改变评论的外键

在此处查看link1 和此处link2

如果您的数据库只有这两个表,您也可以考虑使用数据库优先方法,并使用向导创建的新上下文而不是使用代码优先方法创建的旧上下文

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2019-11-18
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多