using Microsoft.EntityFrameworkCore.Migrations; namespace SharedLibraryCore.Migrations { public partial class EnforceUniqueIndexForEFAliasIPName : Migration { protected override void Up(MigrationBuilder migrationBuilder) { if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.Sqlite") { migrationBuilder.Sql(@"DELETE FROM EFAlias WHERE AliasId IN ( SELECT AliasId from ( SELECT AliasId, Name, Min(DateAdded), IPAddress FROM EFAlias where (IPAddress, Name) in (SELECT DISTINCT IPAddress, Name FROM EFAlias GROUP BY EFAlias.IPAddress, Name HAVING count(IPAddress) > 1 AND count(Name) > 1) GROUP BY IPAddress ORDER BY IPAddress))", true); migrationBuilder.Sql(@"CREATE UNIQUE INDEX IX_EFAlias_Name_IPAddress ON EFAlias ( IPAddress, Name );", true); return; } else if (migrationBuilder.ActiveProvider == "Pomelo.EntityFrameworkCore.MySql") { migrationBuilder.Sql(@"CREATE TEMPORARY TABLE DUPLICATE_ALIASES SELECT MIN(`AliasId`) `MIN`, MAX(`AliasId`) `MAX`, `LinkId` FROM `EFAlias` WHERE (`IPAddress`, `NAME`) IN( SELECT DISTINCT `IPAddress`, `NAME` FROM `EFAlias` GROUP BY `EFAlias`.`IPAddress`, `NAME` HAVING COUNT(`IPAddress`) > 1 AND COUNT(`NAME`) > 1 ) GROUP BY `IPAddress` ORDER BY `IPAddress`; SET SQL_SAFE_UPDATES = 0; UPDATE `EFClients` AS `Client` JOIN DUPLICATE_ALIASES `Duplicate` ON `Client`.CurrentAliasId = `Duplicate`.`MIN` SET `Client`.CurrentAliasId = `Duplicate`.`MAX` WHERE `Client`.`CurrentAliasId` IN( SELECT `MIN` FROM DUPLICATE_ALIASES ); DELETE FROM `EFAlias` WHERE `AliasId` IN( SELECT `MIN` FROM DUPLICATE_ALIASES ); SET SQL_SAFE_UPDATES = 1; DROP TABLE DUPLICATE_ALIASES;"); } else { migrationBuilder.Sql(@"DELETE FROM ""EFAlias"" WHERE ""AliasId"" IN ( SELECT MIN(""AliasId"") AliasId FROM ""EFAlias"" WHERE(""IPAddress"", ""Name"") IN ( SELECT DISTINCT ""IPAddress"", ""Name"" FROM ""EFAlias"" GROUP BY ""EFAlias"".""IPAddress"", ""Name"" HAVING COUNT(""IPAddress"") > 1 AND COUNT(""Name"") > 1 ) GROUP BY ""IPAddress"" ORDER BY ""IPAddress"" )", true); } migrationBuilder.CreateIndex( name: "IX_EFAlias_Name_IPAddress", table: "EFAlias", columns: new[] { "Name", "IPAddress" }, unique: true); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropIndex( name: "IX_EFAlias_Name_IPAddress", table: "EFAlias"); } } }