|
3 | 3 | using System.Text.RegularExpressions;
|
4 | 4 | using Microsoft.EntityFrameworkCore;
|
5 | 5 | using Microsoft.EntityFrameworkCore.Infrastructure;
|
| 6 | +using Microsoft.EntityFrameworkCore.Metadata; |
6 | 7 | using Microsoft.EntityFrameworkCore.Migrations;
|
7 | 8 | using Microsoft.EntityFrameworkCore.TestUtilities;
|
8 | 9 | using Microsoft.Extensions.DependencyInjection;
|
@@ -362,6 +363,133 @@ IF NOT EXISTS(SELECT 1 FROM `__EFMigrationsHistory` WHERE `MigrationId` = '00000
|
362 | 363 | DROP PROCEDURE `POMELO_AFTER_ADD_PRIMARY_KEY`;
|
363 | 364 |
|
364 | 365 |
|
| 366 | +""", |
| 367 | + Sql, |
| 368 | + ignoreLineEndingDifferences: true); |
| 369 | + } |
| 370 | + |
| 371 | + [ConditionalFact] |
| 372 | + public virtual void Alter_column_change_primary_key_will_not_try_to_declare_default_value_in_sql() |
| 373 | + { |
| 374 | + using var db = Fixture.CreateContext<FullInfrastructureMigrationsFixture.MigrationPrimaryKeyChangeFromStringToIntContext>( |
| 375 | + new ServiceCollection() |
| 376 | + .AddScoped<IMigrator, MySqlTestMigrator>()); |
| 377 | + |
| 378 | + db.Database.EnsureDeleted(); |
| 379 | + db.Database.EnsureCreated(); |
| 380 | + |
| 381 | + var migrator = (MySqlTestMigrator)db.GetService<IMigrator>(); |
| 382 | + migrator.MigrationsSqlGenerationOptionsOverrider = options => options & ~MigrationsSqlGenerationOptions.Script; |
| 383 | + |
| 384 | + SetSql(migrator.GenerateScript()); |
| 385 | + |
| 386 | + Assert.False(Sql.Contains("DEFAULT 0")); |
| 387 | + Assert.Equal( |
| 388 | +""" |
| 389 | +CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` ( |
| 390 | + `MigrationId` varchar(150) CHARACTER SET utf8mb4 NOT NULL, |
| 391 | + `ProductVersion` varchar(32) CHARACTER SET utf8mb4 NOT NULL, |
| 392 | + CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`) |
| 393 | +) CHARACTER SET=utf8mb4; |
| 394 | +
|
| 395 | +START TRANSACTION; |
| 396 | +CREATE TABLE `IceCreams` ( |
| 397 | + `Name` varchar(32) NOT NULL, |
| 398 | + CONSTRAINT `PK_IceCreams` PRIMARY KEY (`Name`) |
| 399 | +); |
| 400 | +
|
| 401 | +INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) |
| 402 | +VALUES ('00000000000001_Migration1', '7.0.0-test'); |
| 403 | +
|
| 404 | +DROP PROCEDURE IF EXISTS `POMELO_BEFORE_DROP_PRIMARY_KEY`; |
| 405 | +CREATE PROCEDURE `POMELO_BEFORE_DROP_PRIMARY_KEY`(IN `SCHEMA_NAME_ARGUMENT` VARCHAR(255), IN `TABLE_NAME_ARGUMENT` VARCHAR(255)) |
| 406 | +BEGIN |
| 407 | + DECLARE HAS_AUTO_INCREMENT_ID TINYINT(1); |
| 408 | + DECLARE PRIMARY_KEY_COLUMN_NAME VARCHAR(255); |
| 409 | + DECLARE PRIMARY_KEY_TYPE VARCHAR(255); |
| 410 | + DECLARE SQL_EXP VARCHAR(1000); |
| 411 | + SELECT COUNT(*) |
| 412 | + INTO HAS_AUTO_INCREMENT_ID |
| 413 | + FROM `information_schema`.`COLUMNS` |
| 414 | + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) |
| 415 | + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT |
| 416 | + AND `Extra` = 'auto_increment' |
| 417 | + AND `COLUMN_KEY` = 'PRI' |
| 418 | + LIMIT 1; |
| 419 | + IF HAS_AUTO_INCREMENT_ID THEN |
| 420 | + SELECT `COLUMN_TYPE` |
| 421 | + INTO PRIMARY_KEY_TYPE |
| 422 | + FROM `information_schema`.`COLUMNS` |
| 423 | + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) |
| 424 | + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT |
| 425 | + AND `COLUMN_KEY` = 'PRI' |
| 426 | + LIMIT 1; |
| 427 | + SELECT `COLUMN_NAME` |
| 428 | + INTO PRIMARY_KEY_COLUMN_NAME |
| 429 | + FROM `information_schema`.`COLUMNS` |
| 430 | + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) |
| 431 | + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT |
| 432 | + AND `COLUMN_KEY` = 'PRI' |
| 433 | + LIMIT 1; |
| 434 | + SET SQL_EXP = CONCAT('ALTER TABLE `', (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())), '`.`', TABLE_NAME_ARGUMENT, '` MODIFY COLUMN `', PRIMARY_KEY_COLUMN_NAME, '` ', PRIMARY_KEY_TYPE, ' NOT NULL;'); |
| 435 | + SET @SQL_EXP = SQL_EXP; |
| 436 | + PREPARE SQL_EXP_EXECUTE FROM @SQL_EXP; |
| 437 | + EXECUTE SQL_EXP_EXECUTE; |
| 438 | + DEALLOCATE PREPARE SQL_EXP_EXECUTE; |
| 439 | + END IF; |
| 440 | +END; |
| 441 | +DROP PROCEDURE IF EXISTS `POMELO_AFTER_ADD_PRIMARY_KEY`; |
| 442 | +CREATE PROCEDURE `POMELO_AFTER_ADD_PRIMARY_KEY`(IN `SCHEMA_NAME_ARGUMENT` VARCHAR(255), IN `TABLE_NAME_ARGUMENT` VARCHAR(255), IN `COLUMN_NAME_ARGUMENT` VARCHAR(255)) |
| 443 | +BEGIN |
| 444 | + DECLARE HAS_AUTO_INCREMENT_ID INT(11); |
| 445 | + DECLARE PRIMARY_KEY_COLUMN_NAME VARCHAR(255); |
| 446 | + DECLARE PRIMARY_KEY_TYPE VARCHAR(255); |
| 447 | + DECLARE SQL_EXP VARCHAR(1000); |
| 448 | + SELECT COUNT(*) |
| 449 | + INTO HAS_AUTO_INCREMENT_ID |
| 450 | + FROM `information_schema`.`COLUMNS` |
| 451 | + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) |
| 452 | + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT |
| 453 | + AND `COLUMN_NAME` = COLUMN_NAME_ARGUMENT |
| 454 | + AND `COLUMN_TYPE` LIKE '%int%' |
| 455 | + AND `COLUMN_KEY` = 'PRI'; |
| 456 | + IF HAS_AUTO_INCREMENT_ID THEN |
| 457 | + SELECT `COLUMN_TYPE` |
| 458 | + INTO PRIMARY_KEY_TYPE |
| 459 | + FROM `information_schema`.`COLUMNS` |
| 460 | + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) |
| 461 | + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT |
| 462 | + AND `COLUMN_NAME` = COLUMN_NAME_ARGUMENT |
| 463 | + AND `COLUMN_TYPE` LIKE '%int%' |
| 464 | + AND `COLUMN_KEY` = 'PRI'; |
| 465 | + SELECT `COLUMN_NAME` |
| 466 | + INTO PRIMARY_KEY_COLUMN_NAME |
| 467 | + FROM `information_schema`.`COLUMNS` |
| 468 | + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) |
| 469 | + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT |
| 470 | + AND `COLUMN_NAME` = COLUMN_NAME_ARGUMENT |
| 471 | + AND `COLUMN_TYPE` LIKE '%int%' |
| 472 | + AND `COLUMN_KEY` = 'PRI'; |
| 473 | + SET SQL_EXP = CONCAT('ALTER TABLE `', (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())), '`.`', TABLE_NAME_ARGUMENT, '` MODIFY COLUMN `', PRIMARY_KEY_COLUMN_NAME, '` ', PRIMARY_KEY_TYPE, ' NOT NULL AUTO_INCREMENT;'); |
| 474 | + SET @SQL_EXP = SQL_EXP; |
| 475 | + PREPARE SQL_EXP_EXECUTE FROM @SQL_EXP; |
| 476 | + EXECUTE SQL_EXP_EXECUTE; |
| 477 | + DEALLOCATE PREPARE SQL_EXP_EXECUTE; |
| 478 | + END IF; |
| 479 | +END; |
| 480 | +CALL POMELO_BEFORE_DROP_PRIMARY_KEY(NULL, 'IceCreams'); |
| 481 | +ALTER TABLE `IceCreams` DROP PRIMARY KEY; |
| 482 | +
|
| 483 | +ALTER TABLE `IceCreams` ADD `IceCreamId` int NOT NULL AUTO_INCREMENT; |
| 484 | +
|
| 485 | +INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) |
| 486 | +VALUES ('00000000000002_Migration2', '7.0.0-test'); |
| 487 | +
|
| 488 | +DROP PROCEDURE `POMELO_BEFORE_DROP_PRIMARY_KEY`; |
| 489 | +DROP PROCEDURE `POMELO_AFTER_ADD_PRIMARY_KEY`; |
| 490 | +COMMIT; |
| 491 | +
|
| 492 | +
|
365 | 493 | """,
|
366 | 494 | Sql,
|
367 | 495 | ignoreLineEndingDifferences: true);
|
@@ -649,6 +777,83 @@ protected override void Down(MigrationBuilder migrationBuilder)
|
649 | 777 |
|
650 | 778 | #endregion MigrationPrimaryKeyChange
|
651 | 779 |
|
| 780 | + public class MigrationPrimaryKeyChangeFromStringToIntContext : DbContext |
| 781 | + { |
| 782 | + public MigrationPrimaryKeyChangeFromStringToIntContext(DbContextOptions options) |
| 783 | + : base(options) |
| 784 | + { |
| 785 | + } |
| 786 | + |
| 787 | + public static class Migrations |
| 788 | + { |
| 789 | + [DbContext(typeof(MigrationPrimaryKeyChangeFromStringToIntContext))] |
| 790 | + [Migration("00000000000001_Migration1")] |
| 791 | + private class Migration1 : Migration |
| 792 | + { |
| 793 | + protected override void Up(MigrationBuilder migrationBuilder) |
| 794 | + { |
| 795 | + MigrationsInfrastructureFixtureBase.ActiveProvider = migrationBuilder.ActiveProvider; |
| 796 | + |
| 797 | + migrationBuilder |
| 798 | + .CreateTable( |
| 799 | + name: "IceCreams", |
| 800 | + columns: table => new |
| 801 | + { |
| 802 | + Name = table.Column<string>(type: "varchar(32)", maxLength: 32, nullable: false) |
| 803 | + }, |
| 804 | + constraints: table => |
| 805 | + { |
| 806 | + table.PrimaryKey("PK_IceCreams", x => x.Name); |
| 807 | + }); |
| 808 | + } |
| 809 | + |
| 810 | + protected override void Down(MigrationBuilder migrationBuilder) |
| 811 | + => migrationBuilder.DropTable("IceCreams"); |
| 812 | + } |
| 813 | + |
| 814 | + [DbContext(typeof(MigrationPrimaryKeyChangeFromStringToIntContext))] |
| 815 | + [Migration("00000000000002_Migration2")] |
| 816 | + private class Migration2 : Migration |
| 817 | + { |
| 818 | + protected override void Up(MigrationBuilder migrationBuilder) |
| 819 | + { |
| 820 | + migrationBuilder.DropPrimaryKey( |
| 821 | + name: "PK_IceCreams", |
| 822 | + table: "IceCreams"); |
| 823 | + |
| 824 | + migrationBuilder.AddColumn<int>( |
| 825 | + name: "IceCreamId", |
| 826 | + table: "IceCreams", |
| 827 | + type: "int", |
| 828 | + nullable: false, |
| 829 | + defaultValue: 0) |
| 830 | + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); |
| 831 | + |
| 832 | + migrationBuilder.AddPrimaryKey( |
| 833 | + name: "PK_IceCreams", |
| 834 | + table: "IceCreams", |
| 835 | + column: "IceCreamId"); |
| 836 | + } |
| 837 | + |
| 838 | + protected override void Down(MigrationBuilder migrationBuilder) |
| 839 | + { |
| 840 | + migrationBuilder.DropPrimaryKey( |
| 841 | + name: "PK_IceCreams", |
| 842 | + table: "IceCreams"); |
| 843 | + |
| 844 | + migrationBuilder.DropColumn( |
| 845 | + name: "IceCreamId", |
| 846 | + table: "IceCreams"); |
| 847 | + |
| 848 | + migrationBuilder.AddPrimaryKey( |
| 849 | + name: "PK_IceCreams", |
| 850 | + table: "IceCreams", |
| 851 | + column: "Name"); |
| 852 | + } |
| 853 | + } |
| 854 | + } |
| 855 | + } |
| 856 | + |
652 | 857 | #region MigrationDropPrimaryKeyWithRecreatingForeignKeys
|
653 | 858 |
|
654 | 859 | public class MigrationDropPrimaryKeyWithRecreatingForeignKeysContext : PoolableDbContext
|
|
0 commit comments