Как изменить один первичный ключ на составной первичный ключ с EF Core - PullRequest
1 голос
/ 25 марта 2020

Я хочу удалить один столбец идентификатора первичного ключа в таблице SQL, которая уже создана и не содержит данных, и вместо этого определить составной первичный ключ.

Мое текущее определение сущности выглядит следующим образом :

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

public long IpFrom { get; set; }

public long IpTo { get; set; }
...

И я хочу обновить это:

[Key, Column(Order = 0)]
public long IpFrom { get; set; }

[Key, Column(Order = 1)]
public long IpTo { get; set; }
...

Я уже сделал следующее определение, используя свободный API:

protected override void OnModelCreating(ModelBuilder builder)
{
   base.OnModelCreating(builder);

   builder.Entity<IPv4LocationEntity>()
     .HasKey(b => new {b.IpFrom, b.IpTo})
     .HasName("PK_TableName");
}

Затем я использовал EF Tool для создания файлов миграции и получения следующего файла миграции.

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropPrimaryKey(
            name: "PK_TableName",
            table: "TableName");

        migrationBuilder.DropColumn(
            name: "Id",
            table: "TableName");

        migrationBuilder.AddPrimaryKey(
            name: "PK_TableName",
            table: "TableName",
            columns: new[] { "IpFrom", "IpTo" });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropPrimaryKey(
            name: "PK_TableName",
            table: "TableName");

        migrationBuilder.AddColumn<int>(
            name: "Id",
            table: "TableName",
            type: "int",
            nullable: false,
            defaultValue: 0)
            .Annotation("SqlServer:Identity", "1, 1");

        migrationBuilder.AddPrimaryKey(
            name: "PK_TableName",
            table: "TableName",
            column: "Id");
    }
}

Я получаю следующую ошибку, когда хочу обновить базу данных с помощью инструмента EF, хотя мне все кажется правильным:

ALTER TABLE DROP COLUMN failed because column 'Id' does not exist in table 'TableName'.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 25 марта 2020

Я попробовал это и под управлением dotnet ef database update не применяется миграция.

Вместо этого сгенерируйте файл SQL из миграции и выполните запросы SQL. Попробуйте сделать это.

cd ToYourDbModelProject
dotnet ef  --startup-project ../PathToStartupProject/ migrations script previous_migration current_migration -o current_migration.sql --context Namespace.To.Your.DbContext
...