实体框架7身份种子

时间:2016-01-21 15:23:57

标签: c# entity-framework entity-framework-core

我们正在使用EF7的Code First,我想添加一个具有从另一个值开始的身份种子的列。

目前,我们可以使用以下命令在迁移过程中通过EntityTypeBuilder将其设置为自动增量:

entityBuilder.Property(e => e.PropertyName).ValueGeneratedOnAdd();

但是我无法找到如何更改身份种子。它是否仍然需要像其他版本的EF一样更新?例如编写一些自定义sql并在迁移期间运行它?

How to seed identity seed value in entity framework code first for several tables

How do I set Identity seed on an ID column using Entity Framework 4 code first with SQL Compact 4?

在EF7中似乎没有SqlServerMigrationSqlGenerator > override Generate(AltherTableOperation alterTableOperation)的代码?

4 个答案:

答案 0 :(得分:3)

In Entity Framework Core Use Sql Command in Up method:

Important Part: migrationBuilder.Sql("DBCC CHECKIDENT ('Payment', RESEED, 1000000)");

using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using System;

namespace PaymentService.Migrations
{
    public partial class Initial : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
            name: "Payment",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                          .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Payment", x => x.Id);
            });

            // Below code is for seeding the identity
            migrationBuilder.Sql("DBCC CHECKIDENT ('Payment', RESEED, 1000000)");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(name: "Payment");
        }
    }
}

答案 1 :(得分:3)

更新2020

在EF Core 3.0之后,您有了 UseIdentityColumn 扩展方法,可用于设置标识列的种子值和增量值。

builder.Property(prop => prop.Id)
            .UseIdentityColumn(10000000, 1);

根据官方文档:

UseIdentityColumn将键属性配置为在定位SQL Server时使用SQL Server IDENTITY功能为新实体生成值。此方法将属性设置为OnAdd。

Link

答案 2 :(得分:0)

是的,您必须编写所需的SQL语句来设置种子,然后在迁移中使用Sql方法。

答案 3 :(得分:0)

如果您使用 MySQL 而不是 SQL Server,添加以下内容代替第一个答案中的 "migrationBuilder.Sql("DBCC CHECKIDENT ('Payment', RESEED, 1000000)");"

migrationBuilder.Sql("use db_name; ALTER TABLE Clients AUTO_INCREMENT = start_value;");