EF迁移正在删除列并尝试将不存在的列重命名为Id

Lan*_*ndy 5 sql entity-framework code-first ef-model-builder

我有一个使用EF的Code First MVC项目.

有两个表,TableA并且TableB,它们目前具有一对多的关系:

public partial class TableA
{ 
    public TableA()
    {
        TableBs = new HashSet<TableB>();
    }

    public int Id { get; set; }
    public Virtual ICollection<TableB> TableBs { get; set; }
}

public partial class TableB
{
    public int Id { get; set; }
    public int TableAId { get; set; }
    public virtual TableA TableAs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

    modelBuilder.Entity<TableA>()
        .HasMany(e => e.TableBs)
        .WithRequired(e => e.TableA)
        .HasForeignKey(e => e.TableAId);
Run Code Online (Sandbox Code Playgroud)

我试图改变TableA它给它一对一或零关系:

public partial class TableA
{ 
    public TableA() { }

    public int Id { get; set; }
    public int? TableBId { get; set; }
    public virtual TableB TableB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

TableB保持不变,我改变了我的OnModelCreating喜好:

    modelBuilder.Entity<TableA>()
        .HasOptional(e => e.TableBs);

    modelBuilder.Entity<TableB>()
        .HasRequired(e => e.TableAs);
Run Code Online (Sandbox Code Playgroud)

问题是生成的迁移是意料之外的 - 这对我来说很意外,因为我不知道我在做什么,显然.它不是添加FK并添加列,而是尝试重命名列.这是我的迁移:

 public override void Up()
    {
        DropForeignKey("dbo.TableA", "TableBId", "dbo.TableB");
        DropIndex("dbo.TableA", new[] { "TableBId" });
        DropColumn("dbo.TableB", "Id"); 
        RenameColumn(table: "dbo.TableB", name: "TableBId", newName: "Id");
        DropPrimaryKey("dbo.TableB");
        AlterColumn("dbo.TableA", "TableBId", c => c.Int());
        AlterColumn("dbo.TableB", "Id", c => c.Int(nullable: false));
        AlterColumn("dbo.TableB", "TableAId", c => c.Int(nullable: false));
        AddPrimaryKey("dbo.TableB", "Id");
        CreateIndex("dbo.TableB", "Id");
    }
Run Code Online (Sandbox Code Playgroud)

我不明白为什么要重命名一个不存在的列,我的新FK在哪里?

jjj*_*jjj 4

有几件事可能会导致您出现问题:

  1. 描述关系的流畅 API 调用

    modelBuilder.Entity<TableA>()
       .HasOptional(e => e.TableBs);
    
    modelBuilder.Entity<TableB>()
       .HasRequired(e => e.TableAs);
    
    Run Code Online (Sandbox Code Playgroud)

    因为您在这里使用了两个引用不同属性的单独调用,所以我认为 EF 有可能将其解释为两个单独的关系。另一方面,由于它们都是一对一的,所以可能没问题。无论如何,它会更有意义:

    modelBuilder.Entity<TableA>()
       .HasOptional(e => e.TableBs)
       .WithRequired(t => t.TableAs);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 实体之间的任何类型的一对一关系都要求两种实体类型共享主键(其中从属/可选方的主键也是外键),这是生成的迁移混乱的主要原因。

  3. 我认为您过去也可能尝试运行迁移来TableBId创建dbo.TableA.