entity-framework - 如何改变关系首先保留实体框架代码中的现有数据?

entity-framework - 如何改变关系首先保留实体框架代码中的现有数据?,第1张

我有两个实体

public class Account
    {
        [Key]
        public int Id { get; set;
        public int MemberInfoId { get; set; }
        public Member MemberInfo { get; set; }
        //Other Properties
    }

public class Member
    {
        [Key]
        public int Id { get; set; }
        //Other Properties
    }

以下关系

modelBuilder.Entity<Account>()
                .HasRequired(a => a.MemberInfo)
                .WithMany()
                .HasForeignKey(a => a.MemberInfoId)
                .WillCascadeOnDelete(true);

但是,一个帐户只有一个成员,因此以下关系更适合(我猜)

modelBuilder.Entity<Account>()
                .HasRequired(a => a.MemberInfo)
                .WithRequiredPrincipal()
                .WillCascadeOnDelete(true);

但代码首次迁移不会迁移到该代码。它出现以下错误

The object 'PK_dbo.Members' is dependent on column 'Id'.
The object 'FK_dbo.Accounts_dbo.Members_MemberInfo_Id' is dependent on column 'Id'.
ALTER TABLE DROP COLUMN Id failed because one or more objects access this column.

如果不重新创建数据库以保留已插入的数据,我该怎么做才能改变关系?

最佳答案:

1 个答案:

答案 0 :(得分:2)

首先,您可以阅读有关基于代码的迁移与自动迁移的this page,以了解您是否想要首先使用此路线。一般来说,如果你有一个团队参与,这不是一个好主意。

接下来,知道如果将MemberAccount之间的关系更改为一对一,实体框架要求依赖方的主键也是外键。从EF的角度来看,曾经是依赖方主键的列将变得无用。您也不再需要Account.MemberInfoId

最后要创建迁移,之后完成修改模型,您可以使用迁移名称运行Add-Migration。这将创建一个包含DbMigration类的迁移文件,您可以修改该类。您可能需要执行以下操作:

  • Member中创建一个包含新外键的新列
  • 使用Sql()使用关联帐户的主键
  • 更新该列中的值
  • 删除外键约束,索引和主键
  • 删除account.memberinfo_id列和member.id列(这是可选的,但如果您不删除member.id列,则必须确保映射模型&#39; s Member.Id属性到上面创建的列。)
  • 将成员中的新列重命名为id
  • 将主键添加到Member
  • 中的新列
  • 添加索引和外键

我确定我错过了什么,但那是一般的要点。我可能也会备份所有内容,因为前五次保证会出错。

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复