在实体优先迁移中为新 Guid 列添加默认值

djb*_*ois 1 migration asp.net-mvc ef-code-first

我正在为我的项目使用实体代码首次迁移。我已经启动并运行了系统。但是,我需要添加一个新的 Guid 列,它是一个外键。在尝试更新数据库时,我收到以下错误:

ALTER TABLE 语句与 FOREIGN KEY 约束“FK_dbo.Categories_dbo.aspnet_Roles_RoleId”冲突。冲突发生在数据库“HelpDesk”、表“dbo.aspnet_Roles”、“RoleId”列中。

所以我做了一些研究,发现Entity Framework 6 Code first Default value。但是,我无法弄清楚如何让它为 Guid 设置默认值。这是我试过的代码:

这是迁移:

public override void Up()
{

     AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValue: "4468ACB7-AD6F-471E-95CF-615115EA3A76"));
     CreateIndex("dbo.Categories", "RoleId");
     AddForeignKey("dbo.Categories", "RoleId", "dbo.aspnet_Roles", "RoleId");
}

public override void Down()
{
     DropForeignKey("dbo.Categories", "RoleId", "dbo.aspnet_Roles");
     DropIndex("dbo.Categories", new[] { "RoleId" });
     DropColumn("dbo.Categories", "RoleId");
}
Run Code Online (Sandbox Code Playgroud)

如果我切换到此代码,我能够摆脱所有构建错误(但如果我运行 Update-database,仍然会出现 Alter Table 错误:

AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, identity: false, defaultValue: null));
Run Code Online (Sandbox Code Playgroud)

如何将其转换为添加特定 Guid 作为默认值?

Yah*_*ous 7

我想你已经想通了,但我认为(未经测试):

  • 这应该适用于常量(固定)C#- Guid -value:

    AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValue: new Guid("4468ACB7-AD6F-471E-95CF-615115EA3A76")));
    
    Run Code Online (Sandbox Code Playgroud)
  • 这应该适用于使用defaultValueSql常量(固定)C#- string -value

    AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValueSql: "4468ACB7-AD6F-471E-95CF-615115EA3A76")));
    
    Run Code Online (Sandbox Code Playgroud)
  • 而对于其他人(像我)寻找一个唯一值(每表行不同),通过SqlServer的决定,你可能想使用defaultValueSql: "NewId()"(通过启发这个答案):

     AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValueSql: "NewId()")));
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

使用实体框架迁移生成器:

在我第一次运行时,defaultValue 将 PK 设置为一个新的 Guid。使用 defaultValueSql: "NewId()" 相反,可以完美地满足我的目的。

protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropUniqueConstraint("PK_Payments", "Payments");

            migrationBuilder.DropColumn(
                name: "PaymentId",
                table: "Payments");

            migrationBuilder.AddColumn<Guid>(
                name: "PaymentId",
                table: "Payments",
                type: "uniqueidentifier",
                defaultValueSql: "NewId()",
                nullable: false);
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

3517 次

最近记录:

4 年,4 月 前