gpt4 book ai didi

entity-framework-6 - 从int到Guid主键问题的代码优先迁移

转载 作者:行者123 更新时间:2023-12-04 17:17:38 27 4
gpt4 key购买 nike

我试图将代码的第一个ID列从'int'更改为'Guid',并且在尝试运行迁移时收到以下消息:

Identity column 'CustomFieldId' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

我正在定义像这样的列:
public partial class CustomField : BaseEntity
{

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid CustomFieldId { get; set; }

像这样在CustomFieldMapping.cs中映射它:
public CustomFieldMapping()
{
//Primary key
HasKey(t => t.CustomFieldId);

//Constraints
Property(t => t.CustomFieldId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

而生成的迁移正试图做到这一点:
public override void Up()
{
DropForeignKey("dbo.CustomField", "CustomFormId", "dbo.CustomForm");
DropForeignKey("dbo.CustomData", "CustomFieldId", "dbo.CustomField");
DropForeignKey("dbo.CustomForm", "ParentFormId", "dbo.CustomForm");
DropIndex("dbo.CustomField", new[] { "CustomFormId" });
DropIndex("dbo.CustomForm", new[] { "ParentFormId" });
DropIndex("dbo.CustomData", new[] { "CustomFieldId" });
DropPrimaryKey("dbo.CustomField");
DropPrimaryKey("dbo.CustomForm");
AlterColumn("dbo.CustomField", "CustomFieldId", c => c.Guid(nullable: false));
AlterColumn("dbo.CustomField", "SortOrder", c => c.Int(nullable: false));
AlterColumn("dbo.CustomForm", "CustomFormId", c => c.Guid(nullable: false));
AlterColumn("dbo.CustomForm", "ParentFormId", c => c.Guid());
AddPrimaryKey("dbo.CustomField", "CustomFieldId");
AddPrimaryKey("dbo.CustomForm", "CustomFormId");
CreateIndex("dbo.CustomField", "CustomForm_CustomFormId");
CreateIndex("dbo.CustomForm", "ParentFormId");
CreateIndex("dbo.CustomData", "CustomField_CustomFieldId");
AddForeignKey("dbo.CustomField", "CustomForm_CustomFormId", "dbo.CustomForm", "CustomFormId");
AddForeignKey("dbo.CustomData", "CustomField_CustomFieldId", "dbo.CustomField", "CustomFieldId");
AddForeignKey("dbo.CustomForm", "ParentFormId", "dbo.CustomForm", "CustomFormId");

我希望它是按顺序递增的Guid。我究竟做错了什么?

最佳答案

为了解决此问题,我在迁移类的Sql()Up()方法中使用了Down()方法。 Up()方法中的SQL命令字符串删除了ID列上的主键约束,删除了int类型的ID列,然后添加了一个类型为Guid的新ID列。 Down()方法执行相同的操作,但是删除了Guid列,并添加了一个新的int列。

我在Stack Overflow上找到了一些解决方案,这些解决方案通过在查询窗口中运行SQL命令来解决“更改列类型”。要发表您的评论:

We're just trying to keep a clean/clear migration path to trace when we did what which is not always easy with SQL.



我在 Up()Down()迁移方法中使用了SQL命令。对我来说,这种解决方案在我的项目中效果很好。

此答案底部的解决方案是由几个Stack Overflow问题/答案构成的。跳到那只是代码。这是冗长的细节。

在迁移类中使用SQL命令

我找不到仅使用诸如 AlterColumn()DropColumn()之类的Entity Framework迁移方法的解决方案。

我没有在 Sql()方法中混合使用迁移方法和命令,而是在 Sql()迁移方法中使用了字符串中的所有SQL命令。使用所有SQL命令可以更轻松地在Visual Studio或SQL Server Management Studio的查询窗口中进行测试。

“Uchitha”的 answer给出了添加 Sql()“所需迁移类中的方法”的开始步骤。
  • 使用添加迁移
  • 生成迁移类
  • 使用类似于上述
  • 的代码更改类
  • 使用更新数据库
  • 运行迁移

    答案中的 Sql()方法示例如下所示:
    Sql("UPDATE dbo.YourTable SET Column1 = 'VALUE1' "); 

    更改列类型-通用步骤

    我使用了'JustAnotherUserYouMayMayKnow'的 answer来开始更改列类型的步骤。我没有明确地遵循它,但是它只是提供了删除列并重新创建它的基本框架。
  • 使用新类型
  • 添加新列
  • 使用Sql()通过更新语句
  • 来接管原始列中的数据
  • 删除旧列
  • 重命名新列

  • 顺序GUID

    来自“Icarus”的 answer提供了ALTER TABLE语句,并使用 newsequentialid()来根据您的语句生成顺序的GUID:

    I would like it to be a sequentially incremented Guid.


    ALTER TABLE your_table
    ADD your_column UNIQUEIDENTIFIER DEFAULT newsequentialid() NOT null

    在“Icarus”的答案的评论部分中,请注意“Johan”对隐私的关注:

    If privacy is a concern, do not use newsequentialid(). It is possible to guess the value of the next generated GUID and, therefore, access data associated with that GUID



    修改主键

    您要更改的列是一个ID列,并且已将其设置为主键。因此,在删除现有的ID列之前,您需要使用另一个 ALTER TABLE SQL命令删除主键。

    请参阅从“darnir”中选择的 answer,以了解“如何使用SQL语法更改主键约束?”
    ALTER TABLE <Table_Name>
    DROP CONSTRAINT <constraint_name>

    ALTER TABLE <Table_Name>
    ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)

    请参阅“Oleg”的注释以确定这是否是一个因素:

    PRIMARY KEY CONSTRAINT cannot be altered, you may only drop it and create again. For big datasets it can cause a long run time and thus - table inavailability.



    当执行上面带有 DROP CONSTRAINT的命令时,我遇到了问题。即使在 ALTER TABLE ... ADD COLUMN命令中使用了特定的约束名称,结果 Pane 也会列出一个自动生成的约束。请参见此 question“为什么SQL会继续创建DF约束?”如果您遇到类似的情况,请输入 question

    为了解决删除约束的问题,我使用了 question中'ScubaSteve'的答案:“如何在不知道其名称的情况下删除SQL默认约束?”加上“七”字样的注释,这是SQL命令:
    DECLARE @ObjectName NVARCHAR(100)
    SELECT @ObjectName = OBJECT_NAME([default_object_id]) FROM SYS.COLUMNS
    WHERE [object_id] = OBJECT_ID('[tableSchema].[tableName]') AND [name] = 'columnName';
    IF @ObjectName IS NOT NULL EXEC('ALTER TABLE [tableSchema].[tableName] DROP CONSTRAINT ' + @ObjectName)

    “ScubaSteve”的答案中“Seven”的评论。我添加了“if”条件,因为当找不到约束时,EXEC有时会失败。

    To make this script idempotent add IF @ObjectName IS NOT NULL before EXEC command



    最终的解决方案

    确保将下面代码中的 MyTableNameMyColumnNamedbo分别替换为表名,列名(例如,将列名设置为 Id)和表架构。
    public override void Up()
    {
    Sql(@"
    DECLARE @ObjectName NVARCHAR(100)
    SELECT @ObjectName = OBJECT_NAME([default_object_id]) FROM SYS.COLUMNS
    WHERE [object_id] = OBJECT_ID('[dbo].[MyTableName]') AND [name] = 'MyColumnName';
    IF @ObjectName IS NOT NULL EXEC('ALTER TABLE [dbo].[MyTableName] DROP CONSTRAINT ' + @ObjectName)

    ALTER TABLE dbo.MyTableName DROP CONSTRAINT PK_MyTableName, COLUMN MyColumnName

    ALTER TABLE dbo.MyTableName
    ADD Id UNIQUEIDENTIFIER DEFAULT (newsequentialid()) NOT NULL
    CONSTRAINT PK_MyTableName
    PRIMARY KEY CLUSTERED ([MyColumnName])
    ");
    }

    public override void Down()
    {
    Sql(@"
    DECLARE @ObjectName NVARCHAR(100)
    SELECT @ObjectName = OBJECT_NAME([default_object_id]) FROM SYS.COLUMNS
    WHERE [object_id] = OBJECT_ID('[dbo].[MyTableName]') AND [name] = 'MyColumnName';
    IF @ObjectName IS NOT NULL EXEC('ALTER TABLE [dbo].[MyTableName] DROP CONSTRAINT ' + @ObjectName)

    ALTER TABLE dbo.MyTableName DROP CONSTRAINT PK_MyTableName, COLUMN Id

    ALTER TABLE MyTableName
    ADD MyColumnName int IDENTITY(1, 1) NOT NULL
    CONSTRAINT PK_MyTableName
    PRIMARY KEY CLUSTERED ([MyColumnName] ASC)
    ");
    }

    关于entity-framework-6 - 从int到Guid主键问题的代码优先迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31926542/

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