diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenSevenZero/AddUserGroupTables.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenSevenZero/AddUserGroupTables.cs index 5e67dcfedd..ff778fdabc 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenSevenZero/AddUserGroupTables.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenSevenZero/AddUserGroupTables.cs @@ -6,6 +6,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenSevenZero @@ -343,15 +344,24 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenSevenZe if (tables.InvariantContains("umbracoUserType") && tables.InvariantContains("umbracoUser")) { - if (constraints.Any(x => x.Item1.InvariantEquals("umbracoUser") && x.Item3.InvariantEquals("FK_umbracoUser_umbracoUserType_id"))) + if (Context.CurrentDatabaseProvider == DatabaseProviders.MySql) { - Delete.ForeignKey("FK_umbracoUser_umbracoUserType_id").OnTable("umbracoUser"); + //In MySql, this will drop the FK according to it's special naming rules + Delete.ForeignKey().FromTable("umbracoUser").ForeignColumn("userType").ToTable("umbracoUserType").PrimaryColumn("id"); } - //This is the super old constraint name of the FK for user type so check this one too - if (constraints.Any(x => x.Item1.InvariantEquals("umbracoUser") && x.Item3.InvariantEquals("FK_user_userType"))) + else { - Delete.ForeignKey("FK_user_userType").OnTable("umbracoUser"); - } + //Delete the FK if it exists before dropping the column + if (constraints.Any(x => x.Item1.InvariantEquals("umbracoUser") && x.Item3.InvariantEquals("FK_umbracoUser_umbracoUserType_id"))) + { + Delete.ForeignKey("FK_umbracoUser_umbracoUserType_id").OnTable("umbracoUser"); + } + //This is the super old constraint name of the FK for user type so check this one too + if (constraints.Any(x => x.Item1.InvariantEquals("umbracoUser") && x.Item3.InvariantEquals("FK_user_userType"))) + { + Delete.ForeignKey("FK_user_userType").OnTable("umbracoUser"); + } + } Delete.Column("userType").FromTable("umbracoUser"); Delete.Table("umbracoUserType"); @@ -361,4 +371,4 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenSevenZe public override void Down() { } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index 4117d582c2..9b52af6827 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -207,20 +207,17 @@ namespace Umbraco.Core.Services { return repository.GetByUsername(username, includeSecurityData: true); } - catch (Exception ex) + catch (DbException ex) { - if (ex is SqlException || ex is SqlCeException) + //we need to handle this one specific case which is when we are upgrading to 7.7 since the user group + //tables don't exist yet. This is the 'easiest' way to deal with this without having to create special + //version checks in the BackOfficeSignInManager and calling into other special overloads that we'd need + //like "GetUserById(int id, bool includeSecurityData)" which may cause confusion because the result of + //that method would not be cached. + if (ApplicationContext.Current.IsUpgrading) { - //we need to handle this one specific case which is when we are upgrading to 7.7 since the user group - //tables don't exist yet. This is the 'easiest' way to deal with this without having to create special - //version checks in the BackOfficeSignInManager and calling into other special overloads that we'd need - //like "GetUserById(int id, bool includeSecurityData)" which may cause confusion because the result of - //that method would not be cached. - if (ApplicationContext.Current.IsUpgrading) - { - //NOTE: this will not be cached - return repository.GetByUsername(username, includeSecurityData: false); - } + //NOTE: this will not be cached + return repository.GetByUsername(username, includeSecurityData: false); } throw; } @@ -789,20 +786,17 @@ namespace Umbraco.Core.Services var result = repository.Get(id); return result; } - catch (Exception ex) + catch (DbException ex) { - if (ex is SqlException || ex is SqlCeException) + //we need to handle this one specific case which is when we are upgrading to 7.7 since the user group + //tables don't exist yet. This is the 'easiest' way to deal with this without having to create special + //version checks in the BackOfficeSignInManager and calling into other special overloads that we'd need + //like "GetUserById(int id, bool includeSecurityData)" which may cause confusion because the result of + //that method would not be cached. + if (ApplicationContext.Current.IsUpgrading) { - //we need to handle this one specific case which is when we are upgrading to 7.7 since the user group - //tables don't exist yet. This is the 'easiest' way to deal with this without having to create special - //version checks in the BackOfficeSignInManager and calling into other special overloads that we'd need - //like "GetUserById(int id, bool includeSecurityData)" which may cause confusion because the result of - //that method would not be cached. - if (ApplicationContext.Current.IsUpgrading) - { - //NOTE: this will not be cached - return repository.Get(id, includeSecurityData: false); - } + //NOTE: this will not be cached + return repository.Get(id, includeSecurityData: false); } throw; }