gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:49:08 25 4
gpt4 key购买 nike

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

有两个表,TableATableB,它们当前具有一对多关系:

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; }
}

    modelBuilder.Entity<TableA>()
.HasMany(e => e.TableBs)
.WithRequired(e => e.TableA)
.HasForeignKey(e => e.TableAId);
<小时/>

我尝试更改 TableA 以赋予其一对零或一的关系:

public partial class TableA
{
public TableA() { }

public int Id { get; set; }
public int? TableBId { get; set; }
public virtual TableB TableB { get; set; }
}

TableB 保持不变,我像这样更改我的 OnModelCreating :

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

modelBuilder.Entity<TableB>()
.HasRequired(e => e.TableAs);

问题是生成的迁移是意外的——这对我来说是意外的,因为显然我不知道自己在做什么。它不是添加 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");
}

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

最佳答案

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

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

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

    modelBuilder.Entity<TableB>()
    .HasRequired(e => e.TableAs);

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

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

  3. 我认为您过去也可能尝试运行迁移,从而在 dbo.TableA 中创建了 TableBId 列。

关于sql - EF 迁移正在删除列并尝试将不存在的列重命名回 Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31437286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com