更改列的IDENTITY属性,需要删除并重新创建列

问题描述 投票:4回答:4

我正在使用EF Core 2.1

这是我最初的模型定义。

public class Customer //Parent
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }

    public BankAccount BankAccount { get; set; }

}


public class BankAccount
{
    public int Id { get; set; }

    public string Branch { get; set; }

    public string AcntNumber { get; set; }

    public DateTime CreatedDate { get; set; }

    public int CustomerId { get; set; }

    public Customer Customer { get; set; }

}

但我意识到IdCustomerId都是开销的一对一关系,我可以更新我的BankAccount模型定义如下。

public class BankAccount
{
    public int Id { get; set; }

    public string Branch { get; set; }

    public string AcntNumber { get; set; }

    public DateTime CreatedDate { get; set; }

    public Customer Customer { get; set; }

}

而在DbContext类中定义了主体实体,如下所示。

HasOne(b => b.Customer).WithOne(c => c.BankAccount).HasForeignKey<BankAccount>(f => f.Id);

在运行update-database时,我收到以下错误。

System.InvalidOperationException:要更改列的IDENTITY属性,需要删除并重新创建列。

但是,理想情况下我不应该只是摆脱这个错误,我删除了列,约束以及表,然后是完整的数据库。但仍然是同样的错误。

c# asp.net entity-framework entity-framework-core ef-core-2.1
4个回答
2
投票

当我试图将模型从public byte Id {get; set;}更改为public int Id {get; set;}时,我遇到了这个问题。为了解决这个问题,我做了以下事情:

  1. 删除所有迁移,直到在Package Manager Console中使用Remove-Migration -Project <target_project>创建目标模型
  2. 删除实际的数据库
  3. 如果您在中间进行了一些尚未创建的迁移(例如,它们来自另一个分支),请复制迁移文件以及ModelSnapshot文件并将其粘贴到分支中(仔细覆盖它们!)。
  4. 使用add-migration <migration_name>在程序包管理器控制台中创建新的迁移
  5. 使用程序包管理器控制台中的update-database更新数据库

我可以用这种方式解决它,因为我的代码不在生产环境中。如果模型已经存在,也许你必须面对另一个复杂的问题。


1
投票

当您尝试更改或修改当您想要更改架构或已存在的表时已存在的表时,会发生此错误,哪个EF核心不支持它,但它需要手动操作。这是你可以做的:

  • 在迁移文件中注释相关代码以避免此错误。
  • 或删除迁移文件并创建一个新文件。
  • 删除上游迁移并让迁移生成新代码。

1
投票

我删除了Migrations文件夹和自动生成的_EFMigrationHistory。再次在Package Manager Console和Add-Migration命令上运行Update-Database MigrationName,问题得以解决。


0
投票

我遇到了同样的问题,我通过两步和两次迁移解决了这个问题:

  1. 删除标识列,在BankAccount中注释Id并添加新的ID,即BankAccountId作为标识,添加迁移和更新:这将删除id并添加新列作为标识。
  2. 删除新添加的列并重新添加上一个,注释BankAccountId和取消注释ID,添加迁移和更新:这将删除BankAccountId并添加Id作为标识。
© www.soinside.com 2019 - 2024. All rights reserved.