实体框架代码优先迁移指导用NewId代替NewSequentialId

时间:2018-12-11 04:53:32

标签: entity-framework ef-migrations

我们将EF6与指向Azure SQL的代码优先迁移一起使用。我们已经开始将一些Guid用于主键以及与int主键一起使用。
主键:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

Alongside int PK:

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

生成迁移时,分别得到如下信息:

Id = c.Guid(nullable: false, identity: true),
PolymorphicId = c.Guid(nullable: false, identity: true),

期望:生成的SQL具有新闻序列ID的默认值

实际上发生了

[Id] [uniqueidentifier] NOT NULL DEFAULT newid(),
[PolymorphicId] [uniqueidentifier] NOT NULL DEFAULT newid(),

如何使我的EF迁移使用newsequentialid而不是newid生成?我在网上查询的所有内容都表明,它们应该使用新闻序列生成。

2 个答案:

答案 0 :(得分:2)

在针对Azure时,SqlServerMigrationSqlGenerator将默认为“ newid()”。当针对本地Sql Server 2005或更高版本时,它将默认为“ newsequentialid()”。 来源:GitHub SqlServerMigrationSqlGenerator.cs

可选修补程序:创建一个自定义SqlGenerator,继承SqlServerMigrationSqlGenerator,重写GuidColumnDefault

可选修补程序:正如JFM所发布的那样,修改生成的迁移文件,并设置defaultValueSql

答案 1 :(得分:0)

您可以尝试在迁移脚本中设置sql服务器列密钥生成所使用的sql,我相信它的外观应与此类似:

Id = c.Guid(nullable: false, identity: true, defaultValueSql: "newsequentialid()")