【问题标题】:Entity Framework - ColumnBuilder实体框架 - ColumnBuilder
【发布时间】:2021-05-01 10:38:31
【问题描述】:

我已经尝试研究了几个小时,没有很多好的文档和示例,我希望有人可以提供更好的理解。

我有一个正在使用实体框架迁移的数据库表。该数据库的先前版本使用“INT32”作为表的主键。作为一个团队,我们决定与其尝试为大型数据库管理此问题,不如将我们可以持有的 ID 数量扩大为 BIGINT。

我创建了一个新的迁移并尝试更新表以现在保存 BIGINT 值。

这是我用来更改此迁移的代码:

DropForeignKey("parts", "FK_Parts_Bins_BinID");
AlterColumn("bins", "ID", c => c.Long(nullable: false, identity: true));
AlterColumn("parts", "BinID", c => c.Long());
AddForeignKey("parts", "BinID", "bins", "ID", false, "FK_Parts_Bins_BinID"); 

我有一个标为“Parts”的表,其中包含对“Bins”表中主键“ID”的外键引用。以前这些只是整数,现在我想使用 BigINT。

我相信我有两个问题:

  1. 我无法重新建立 Bins 和 Parts 之间的连接,因为当我创建新的“identity”列时,bins ID 字段被标记为“unsigned”,而我的 parts BinID 列没有。所以我得到以下异常:

    外键约束“FK_Parts_Bins_BinID”中的引用列“BinID”和引用列“ID”不兼容。

我不知道如何使我的 BinID 列无符号。

  1. 我相信在修复上述异常后,我可能会遇到自动增量字段重置为 0 或 1 的问题。这意味着现有数据 ID 不会被考虑在内。是否有将起始位置更新为现有表中最大 ID 的最佳做法?

微软文档:

https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.migrations.builders.columnbuilder.long?view=entity-framework-6.2.0

【问题讨论】:

    标签: c# mysql entity-framework


    【解决方案1】:

    所以我不确定这是否是最好的解决方案,所以我不会将此标记为最佳答案,希望对实体框架有更多了解的人可以提供更好的答案......但我确实设法得到这个工作 - 并解决了我的两个问题(1和2)

    这就是我所做的:

    DropForeignKey("parts", "FK_Parts_Bins_BinID");
    Sql("ALTER TABLE bins MODIFY COLUMN ID BIGINT NOT NULL AUTO_INCREMENT");
    Sql("ALTER TABLE parts MODIFY COLUMN BinID BIGINT");
    //AlterColumn("bins", "ID", c => c.Long(nullable: false, identity: true));
    //AlterColumn("parts", "BinID", c => c.Long());
    AddForeignKey("parts", "BinID", "bins", "ID", false, "FK_Parts_Bins_BinID");
    

    由于实体框架要求将身份设置为真或假,默认情况下,“身份”会强制将值分配为无符号,但也会强制自动增量重置回 0。

    此解决方案不会重置自动增量,我可以控制分配的值。

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2020-04-11
      • 1970-01-01
      • 2015-12-26
      • 2014-04-01
      • 2014-11-11
      • 1970-01-01
      • 2010-10-07
      • 2011-08-21
      相关资源
      最近更新 更多