My app runs on .Net 7 with EFCore 7.0.5. I have two tables
SystemRole
SystemRoleId PK nvarchar(50)
SystemAssociation (Has clustered PK)
SystemId PK nvarchar(50) FK to SystemRole |
SystemRoleId PK nvarchar(50) FK to SystemRole |
SystemUserId PK nvarchar(50)
Both tables have data. I want to update the length of SystemRoleId in both tables. I added a new migration with
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_SystemAssociations_SystemRoles_SystemId_SystemRoleId",
table: "SystemAssociations");
migrationBuilder.AlterColumn<string>(
name: "SystemRoleId",
table: "SystemRoles",
type: "nvarchar(150)",
maxLength: 150,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(50)",
oldMaxLength: 50);
migrationBuilder.AlterColumn<string>(
name: "SystemRoleId",
table: "SystemAssociations",
type: "nvarchar(150)",
maxLength: 150,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(50)",
oldMaxLength: 50);
migrationBuilder.AddForeignKey(
name: "FK_SystemAssociations_SystemRoles_SystemId_SystemRoleId",
table: "SystemAssociations",
columns: new[] { "SystemId", "SystemRoleId" },
principalTable: "SystemRoles",
principalColumns: new[] { "SystemId", "SystemRoleId" },
onDelete: ReferentialAction.NoAction);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_SystemAssociations_SystemRoles_SystemId_SystemRoleId",
table: "SystemAssociations");
migrationBuilder.AlterColumn<string>(
name: "SystemRoleId",
table: "SystemRoles",
type: "nvarchar(50)",
maxLength: 50,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(150)",
oldMaxLength: 150);
migrationBuilder.AlterColumn<string>(
name: "SystemRoleId",
table: "SystemAssociations",
type: "nvarchar(50)",
maxLength: 50,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(150)",
oldMaxLength: 150);
migrationBuilder.AddForeignKey(
name: "FK_SystemAssociations_SystemRoles_SystemId_SystemRoleId",
table: "SystemAssociations",
columns: new[] { "SystemId", "SystemRoleId" },
principalTable: "SystemRoles",
principalColumns: new[] { "SystemId", "SystemRoleId" },
onDelete: ReferentialAction.NoAction);
}
On Migrate, the app errors ALTER TABLE with constraint FK_SystemAssociations_SystemRoles_SystemId_SystemRoleId
. I tried a alternative with direct SQL in migration, that worked.
migrationBuilder.Sql("rnALTER TABLE [dbo].[SystemAssociations] DROP CONSTRAINT [FK_SystemAssociations_SystemRoles_SystemId_SystemRoleId]rnrnALTER TABLE SystemAssociationsrnALTER COLUMN SystemRoleId NVARCHAR(150) NOT NULLrnrnALTER TABLE SystemRolesrnALTER COLUMN SystemRoleId NVARCHAR(150) NOT NULLrnrnALTER TABLE [dbo].[SystemAssociations] WITH NOCHECK ADD CONSTRAINT [FK_SystemAssociations_SystemRoles_SystemId_SystemRoleId] FOREIGN KEY([SystemId], [SystemRoleId])rnREFERENCES [dbo].[SystemRoles] ([SystemId], [SystemRoleId])rnrnALTER TABLE [dbo].[SystemAssociations] CHECK CONSTRAINT [FK_SystemAssociations_SystemRoles_SystemId_SystemRoleId]");
Not sure why sql worked not the other.
Main problem is when i make new change to schema to migrate, i see a revert of columnlength added to the new migration. Example i added a new column i get below migration
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "SystemRoleId",
table: "SystemRoles",
type: "nvarchar(50)",
maxLength: 50,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(150)",
oldMaxLength: 150);
migrationBuilder.AlterColumn<string>(
name: "SystemRoleId",
table: "SystemAssociations",
type: "nvarchar(50)",
maxLength: 50,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(150)",
oldMaxLength: 150);
migrationBuilder.AddColumn<string>(
name: "Reason",
table: "NotificationManagement",
type: "nvarchar(max)",
nullable: false,
defaultValue: "");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Reason",
table: "NotificationManagement");
migrationBuilder.AlterColumn<string>(
name: "SystemRoleId",
table: "SystemRoles",
type: "nvarchar(150)",
maxLength: 150,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(50)",
oldMaxLength: 50);
migrationBuilder.AlterColumn<string>(
name: "SystemRoleId",
table: "SystemAssociations",
type: "nvarchar(150)",
maxLength: 150,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(50)",
oldMaxLength: 50);
}
If i try to run this migration, it fails due to the FK.
Is there a way to avoid this revert on new migrations?