实体框架更改密钥类型

had*_*w64 6 entity-framework ef-migrations

我创建了一个具有各种值的模型但是愚蠢地使用了GUID我的密钥,我正在尝试将其更改为a Int但是当我这样做时会出现错误.

我已经运行了启用迁移命令:

Enable-Migrations -Force -ContextTypeName project.Models.MyContext
Run Code Online (Sandbox Code Playgroud)

这会创建我期望的迁移,但是当我运行时:

Update-Database -Force
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

操作数类型冲突:uniqueidentifier与int不兼容

我不关心数据库中当前包含的数据,因为它刚刚使用SQL Server Express数据库,但我更愿意找到一种方法来迁移它,而不是只需要完全丢弃数据库,最好的是什么这样做的方法?

我已经有了

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
Run Code Online (Sandbox Code Playgroud)

Global.asax.

Ric*_*ard 13

我希望生成的迁移使用AlterColumn来尝试将字段的类型从guid更改为int.这是不可能的,因此您需要自己修改生成的迁移:

假设你的表是dbo.People并且密钥被称为Id,你现在可能有这个:

DropPrimaryKey("dbo.People");
AlterColumn("dbo.People", "Id", c => c.Int(nullable: false, identity: true));
AddPrimaryKey("dbo.People", "Id");
Run Code Online (Sandbox Code Playgroud)

将其更改为:

DropPrimaryKey("dbo.People");
DropColumn("dbo.People", "Id");
AddColumn("dbo.People", "Id", c => c.Int(nullable: false, identity: true));
AddPrimaryKey("dbo.People", "Id");
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在其他地方引用了此密钥,则如果您有任何数据存在,则此技术将不起作用,因为密钥都已重新生成.


Tom*_*ino 7

EF Core 生成的迁移更新:

dotnet : System.Data.SqlClient.SqlException: Operand type clash: int is incompatible with uniqueidentifier
Run Code Online (Sandbox Code Playgroud)

改变

migrationBuilder.AlterColumn<Guid>(
            name: "VATID",
            schema: "catalogue",
            table: "Products",
            nullable: false,
            oldClrType: typeof(int));
Run Code Online (Sandbox Code Playgroud)

进入

        migrationBuilder.DropColumn(
            name: "VATID",
            schema: "catalogue",
            table: "Products");

        migrationBuilder.AddColumn<Guid>(
            name: "VATID",
            schema: "catalogue",
            table: "Products",
            nullable: false);
Run Code Online (Sandbox Code Playgroud)

当然,这会破坏特定列的数据。但它们显然不能转换为 GUID。