在实体优先迁移中为新Guid列添加默认值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在实体优先迁移中为新Guid列添加默认值相关的知识,希望对你有一定的参考价值。
我正在为我的项目使用实体代码首次迁移。我已经启动并运行了系统。但是,我需要添加一个新的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");
}
如果我切换到这个代码,我能够摆脱所有构建错误(但如果我运行Update-database,仍然会给我Alter Table错误:
AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, identity: false, defaultValue: null));
如何将此转换为添加特定Guid作为默认值?
从错误中,我猜你从数据库中复制了这个Guid值"4468ACB7-AD6F-471E-95CF-615115EA3A76"
,并希望将它用于测试目的,并且EF注意到表中已存在的值并且正在抱怨。它也阻止你使用null,因为你告诉它以防止空值,nullable: false
。所以它期望你提供一个价值。您可以创建一个新的Guid并使用它。见下文
AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValue: Guid.NewGuid().ToString()));
我想你已经弄明白了,但我认为(未经测试):
这适用于固定的C#-Guid值:
AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValue: new Guid("4468ACB7-AD6F-471E-95CF-615115EA3A76")));
这应该适用于使用defaultValueSql的固定C#-string-value:
AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValueSql: "4468ACB7-AD6F-471E-95CF-615115EA3A76")));
对于寻找随机(变化,唯一)值的其他人(比如我),你可能想要使用defaultValueSql: "NewId()"
(灵感来自this answer):
AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValueSql: "NewId()")));
可能是您的数据库初始化程序正在使用默认初始化程序(CreateDatabaseIfNotExists)?改变这些可能有时会导致类似的问题。
这可能不是您的最终答案,但可能与问题有关。我已经附加了一篇关于数据库初始化程序的文章的链接,它可以帮助您找出问题所在。
据我所知,您的代码似乎不是问题的直接原因,它看起来更像是生成的导致问题的迁移脚本。
以上是关于在实体优先迁移中为新Guid列添加默认值的主要内容,如果未能解决你的问题,请参考以下文章
实体框架代码优先:迁移失败并更新数据库,强制不必要的(?)添加迁移