dotnet / efcore

EF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.
https://docs.microsoft.com/ef/
MIT License
13.69k stars 3.17k forks source link

Exception when running migrations when deleting data and removing columns #22302

Closed nathan-c closed 4 years ago

nathan-c commented 4 years ago

A set of migrations that work in 3.1.4 no longer work in 5.0.0-preview.8.20407.4. The problem seems to be when deleting data at the same time as dropping columns on an entity.

Steps to reproduce

EfCoreBug.zip The attached zip contains a project with 2 migrations, one to create a table and insert data and another to change the table and reinsert data.

When running this using 5.0.0-preview.8.20407.4 I get the following exception.

System.InvalidOperationException: There is no property mapped to the column 'SomeEntity.Id' used in a data operation. Either add a property mapped to this column or specify the column types in the data operation.
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.GetMappedProperties(String[] names, String tableName, String schema, IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.GenerateModificationCommands(DeleteDataOperation operation, IModel model)+MoveNext()
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(DeleteDataOperation operation, IModel model, MigrationCommandListBuilder builder)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.<>c.<.cctor>b__79_29(MigrationsSqlGenerator g, MigrationOperation o, IModel m, MigrationCommandListBuilder b)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(MigrationOperation operation, IModel model, MigrationCommandListBuilder builder)
   at Microsoft.EntityFrameworkCore.Migrations.SqlServerMigrationsSqlGenerator.Generate(MigrationOperation operation, IModel model, MigrationCommandListBuilder builder)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(IReadOnlyList`1 operations, IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.SqlServerMigrationsSqlGenerator.Generate(IReadOnlyList`1 operations, IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.GenerateUpSql(Migration migration)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.<>c__DisplayClass16_2.<GetMigrationCommandLists>b__2()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade)
   at EfCoreBug.Program.Main(String[] args) in /home/nathan/git/EfCoreBug/EfCoreBug/Program.cs:line 15

Further technical details

EF Core version: 5.0.0-preview.8.20407.4 Database provider: Microsoft.EntityFrameworkCore.SqlServer (also a problem using Npgsql.EntityFrameworkCore.Postgres) Target framework: .NET Core 3.1 Operating system: Ubuntu 20.04 IDE: Rider 2020.2

smitpatel commented 4 years ago
protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropPrimaryKey(
                name: "PK_SomeEntity",
                table: "SomeEntity");

            migrationBuilder.DeleteData(
                table: "SomeEntity",
                keyColumn: "Id",
                keyValue: -1L);

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

            migrationBuilder.AddColumn<string>(
                name: "Key",
                table: "SomeEntity",
                nullable: false,
                defaultValue: "");

            migrationBuilder.AddPrimaryKey(
                name: "PK_SomeEntity",
                table: "SomeEntity",
                column: "Key");

            migrationBuilder.InsertData(
                table: "SomeEntity",
                columns: new[] { "Key", "Created", "Name", "Updated" },
                values: new object[] { "-1", new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), "Hello", new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc) });
        }

Issue here is that DeleteData operation is using the column name before rename and that is not found in the current model. cc: @AndriySvyryd

lomholdt commented 3 years ago

For others finding this issue we solved it by adding a keyColumnType: "uniqueidentifier" on DeleteData in the migration that was failing.

skkalahasti commented 3 years ago

I had to specify the keycolumntype during deleteData to fix the exception when migrating to efcore 5.

edukzs commented 3 years ago

I had to specify the keycolumntype during deleteData to fix the exception when migrating to efcore 5.

this work for me

Same problem on 5.0.3 version

nkolchakov commented 1 year ago

Same problem on 7.0.3

roji commented 1 year ago

@nkolchakov and others, can you please open a new issue with a minimal, runnable code sample?