diff --git a/src/Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs b/src/Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs index add648bd0b..baf7a99e6e 100644 --- a/src/Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs +++ b/src/Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs @@ -52,23 +52,6 @@ namespace Microsoft.AspNet.Identity.EntityFramework b.ForRelational().Table("AspNetRoleClaims"); }); - var userType = builder.Model.GetEntityType(typeof(TUser)); - var roleType = builder.Model.GetEntityType(typeof(TRole)); - var userClaimType = builder.Model.GetEntityType(typeof(IdentityUserClaim)); - var roleClaimType = builder.Model.GetEntityType(typeof(IdentityRoleClaim)); - var userRoleType = builder.Model.GetEntityType(typeof(IdentityUserRole)); - //var ucfk = userClaimType.GetOrAddForeignKey(userType.GetPrimaryKey(), new[] { userClaimType.GetProperty("UserId") }); - //userType.AddNavigation(new Navigation(ucfk, "Claims", false)); - //userClaimType.AddNavigation(new Navigation(ucfk, "User", true)); - //var urfk = userRoleType.GetOrAddForeignKey(userType.GetPrimaryKey(), new[] { userRoleType.GetProperty("UserId") }); - //userType.AddNavigation(new Navigation(urfk, "Roles", false)); - - //var urfk2 = userRoleType.GetOrAddForeignKey(roleType.GetPrimaryKey(), new[] { userRoleType.GetProperty("RoleId") }); - //roleType.AddNavigation(new Navigation(urfk2, "Users", false)); - - var rcfk = roleClaimType.GetOrAddForeignKey(new[] { roleClaimType.GetProperty("RoleId") }, roleType.GetPrimaryKey()); - roleType.AddNavigation("Claims", rcfk, false); - builder.Entity>(b => { b.Key(r => new { r.UserId, r.RoleId }); diff --git a/src/Microsoft.AspNet.Identity.EntityFramework/RoleStore.cs b/src/Microsoft.AspNet.Identity.EntityFramework/RoleStore.cs index 53cab96a6a..7b14e0aa21 100644 --- a/src/Microsoft.AspNet.Identity.EntityFramework/RoleStore.cs +++ b/src/Microsoft.AspNet.Identity.EntityFramework/RoleStore.cs @@ -59,11 +59,6 @@ namespace Microsoft.AspNet.Identity.EntityFramework } } - public virtual Task GetRoleAggregate(Expression> filter, CancellationToken cancellationToken = default(CancellationToken)) - { - return Roles.FirstOrDefaultAsync(filter); - } - public async virtual Task CreateAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); @@ -163,7 +158,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); var roleId = ConvertIdFromString(id); - return GetRoleAggregate(u => u.Id.Equals(roleId), cancellationToken); + return Roles.FirstOrDefaultAsync(u => u.Id.Equals(roleId), cancellationToken); } /// @@ -176,7 +171,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return GetRoleAggregate(u => u.Name.ToUpper() == name.ToUpper(), cancellationToken); + return Roles.FirstOrDefaultAsync(u => u.Name.ToUpper() == name.ToUpper(), cancellationToken); } private void ThrowIfDisposed() diff --git a/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs b/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs index 18e9b9d87f..591013e8b6 100644 --- a/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs +++ b/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs @@ -72,14 +72,6 @@ namespace Microsoft.AspNet.Identity.EntityFramework return AutoSaveChanges ? Context.SaveChangesAsync(cancellationToken) : Task.FromResult(0); } - protected virtual Task GetUserAggregate(Expression> filter, CancellationToken cancellationToken = default(CancellationToken)) - { - return Users.FirstOrDefaultAsync(filter, cancellationToken); - // TODO: .Include(u => u.Roles) - //.Include(u => u.Claims) - //.Include(u => u.Logins); - } - public Task GetUserIdAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); @@ -184,7 +176,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); var id = ConvertIdFromString(userId); - return GetUserAggregate(u => u.Id.Equals(id), cancellationToken); + return Users.FirstOrDefaultAsync(u => u.Id.Equals(id), cancellationToken); } public virtual TKey ConvertIdFromString(string id) @@ -215,7 +207,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return GetUserAggregate(u => u.NormalizedUserName == normalizedUserName, cancellationToken); + return Users.FirstOrDefaultAsync(u => u.NormalizedUserName == normalizedUserName, cancellationToken); } public IQueryable Users @@ -296,10 +288,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.RoleNotFound, roleName)); } var ur = new IdentityUserRole { UserId = user.Id, RoleId = roleEntity.Id }; - // TODO: rely on fixup? await UserRoles.AddAsync(ur); - user.Roles.Add(ur); - roleEntity.Users.Add(ur); } /// @@ -328,7 +317,6 @@ namespace Microsoft.AspNet.Identity.EntityFramework if (userRole != null) { UserRoles.Remove(userRole); - user.Roles.Remove(userRole); } } } @@ -339,7 +327,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework /// /// /// - public virtual Task> GetRolesAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task> GetRolesAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -348,12 +336,11 @@ namespace Microsoft.AspNet.Identity.EntityFramework throw new ArgumentNullException("user"); } var userId = user.Id; -// TODO: var query = from userRole in UserRoles - var query = from userRole in user.Roles + var query = from userRole in UserRoles join role in Roles on userRole.RoleId equals role.Id + where userRole.UserId.Equals(userId) select role.Name; - //return await query.ToListAsync(); - return Task.FromResult>(query.ToList()); + return await query.ToListAsync(); } /// @@ -371,7 +358,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework { throw new ArgumentNullException("user"); } - if (String.IsNullOrWhiteSpace(roleName)) + if (string.IsNullOrWhiteSpace(roleName)) { throw new ArgumentException(Resources.ValueCannotBeNullOrEmpty, "roleName"); } @@ -380,9 +367,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework { var userId = user.Id; var roleId = role.Id; - return user.Roles.Any(ur => ur.RoleId.Equals(roleId)); - //return await UserRoles.AnyAsync(ur => ur.RoleId.Equals(roleId) && ur.UserId.Equals(userId)); - //return UserRoles.Any(ur => ur.RoleId.Equals(roleId) && ur.UserId.Equals(userId)); + return await UserRoles.AnyAsync(ur => ur.RoleId.Equals(roleId) && ur.UserId.Equals(userId)); } return false; } @@ -502,7 +487,6 @@ namespace Microsoft.AspNet.Identity.EntityFramework }; // TODO: fixup so we don't have to update both await UserLogins.AddAsync(l); - user.Logins.Add(l); } public virtual async Task RemoveLoginAsync(TUser user, string loginProvider, string providerKey, @@ -515,12 +499,10 @@ namespace Microsoft.AspNet.Identity.EntityFramework throw new ArgumentNullException("user"); } var userId = user.Id; - // todo: ensure logins loaded var entry = await UserLogins.SingleOrDefaultAsync(l => l.UserId.Equals(userId) && l.LoginProvider == loginProvider && l.ProviderKey == providerKey); if (entry != null) { UserLogins.Remove(entry); - user.Logins.Remove(entry); } } @@ -532,11 +514,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework { throw new ArgumentNullException("user"); } - // todo: ensure logins loaded - //IList result = user.Logins - // .Select(l => new UserLoginInfo(l.LoginProvider, l.ProviderKey, l.ProviderDisplayName)).ToList(); var userId = user.Id; - return await UserLogins.Where(l => l.UserId.Equals(userId)) .Select(l => new UserLoginInfo(l.LoginProvider, l.ProviderKey, l.ProviderDisplayName)).ToListAsync(); } @@ -546,12 +524,11 @@ namespace Microsoft.AspNet.Identity.EntityFramework { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - // todo: ensure logins loaded var userLogin = await UserLogins.FirstOrDefaultAsync(l => l.LoginProvider == loginProvider && l.ProviderKey == providerKey); if (userLogin != null) { - return await GetUserAggregate(u => u.Id.Equals(userLogin.UserId), cancellationToken); + return await Users.FirstOrDefaultAsync(u => u.Id.Equals(userLogin.UserId), cancellationToken); } return null; } @@ -638,9 +615,9 @@ namespace Microsoft.AspNet.Identity.EntityFramework { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return GetUserAggregate(u => u.Email == email, cancellationToken); + return Users.FirstOrDefaultAsync(u => u.Email == email, cancellationToken); // todo: ToUpper blows up with Null Ref - //return GetUserAggregate(u => u.Email.ToUpper() == email.ToUpper(), cancellationToken); + //return Users.FirstOrDefaultAsync(u => u.Email.ToUpper() == email.ToUpper(), cancellationToken); } /// diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.Test/SqlStoreTestBase.cs b/test/Microsoft.AspNet.Identity.EntityFramework.Test/SqlStoreTestBase.cs index a5d0f07889..b7e52134aa 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.Test/SqlStoreTestBase.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.Test/SqlStoreTestBase.cs @@ -156,16 +156,90 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test IdentityResultAssert.IsSuccess(await manager.DeleteAsync(user)); } - [Fact] - public async Task EnsureRoleClaimNavigationProperty() + private async Task LazyLoadTestSetup(TestDbContext db, TUser user) { var context = CreateContext(); - var roleManager = CreateRoleManager(context); - var r = CreateRole(); - IdentityResultAssert.IsSuccess(await roleManager.CreateAsync(r)); - var c = new Claim("a", "b"); - IdentityResultAssert.IsSuccess(await roleManager.AddClaimAsync(r, c)); - Assert.NotNull(r.Claims.Single(cl => cl.ClaimValue == c.Value && cl.ClaimType == c.Type)); + var manager = CreateManager(context); + var role = CreateRoleManager(context); + var admin = CreateRole("Admin"); + var local = CreateRole("Local"); + IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); + IdentityResultAssert.IsSuccess(await manager.AddLoginAsync(user, new UserLoginInfo("provider", user.Id.ToString(), "display"))); + IdentityResultAssert.IsSuccess(await role.CreateAsync(admin)); + IdentityResultAssert.IsSuccess(await role.CreateAsync(local)); + IdentityResultAssert.IsSuccess(await manager.AddToRoleAsync(user, admin.Name)); + IdentityResultAssert.IsSuccess(await manager.AddToRoleAsync(user, local.Name)); + Claim[] userClaims = + { + new Claim("Whatever", "Value"), + new Claim("Whatever2", "Value2") + }; + foreach (var c in userClaims) + { + IdentityResultAssert.IsSuccess(await manager.AddClaimAsync(user, c)); + } + } + + [Fact] + public async Task LoadFromDbFindByIdTest() + { + var db = CreateContext(); + var user = CreateTestUser(); + await LazyLoadTestSetup(db, user); + + db = CreateContext(); + var manager = CreateManager(db); + + var userById = await manager.FindByIdAsync(user.Id.ToString()); + Assert.Equal(2, (await manager.GetClaimsAsync(userById)).Count); + Assert.Equal(1, (await manager.GetLoginsAsync(userById)).Count); + Assert.Equal(2, (await manager.GetRolesAsync(userById)).Count); + } + + [Fact] + public async Task LoadFromDbFindByNameTest() + { + var db = CreateContext(); + var user = CreateTestUser(); + await LazyLoadTestSetup(db, user); + + db = CreateContext(); + var manager = CreateManager(db); + var userByName = await manager.FindByNameAsync(user.UserName); + Assert.Equal(2, (await manager.GetClaimsAsync(userByName)).Count); + Assert.Equal(1, (await manager.GetLoginsAsync(userByName)).Count); + Assert.Equal(2, (await manager.GetRolesAsync(userByName)).Count); + } + + [Fact] + public async Task LoadFromDbFindByLoginTest() + { + var db = CreateContext(); + var user = CreateTestUser(); + await LazyLoadTestSetup(db, user); + + db = CreateContext(); + var manager = CreateManager(db); + var userByLogin = await manager.FindByLoginAsync("provider", user.Id.ToString()); + Assert.Equal(2, (await manager.GetClaimsAsync(userByLogin)).Count); + Assert.Equal(1, (await manager.GetLoginsAsync(userByLogin)).Count); + Assert.Equal(2, (await manager.GetRolesAsync(userByLogin)).Count); + } + + [Fact] + public async Task LoadFromDbFindByEmailTest() + { + var db = CreateContext(); + var user = CreateTestUser(); + user.Email = "fooz@fizzy.pop"; + await LazyLoadTestSetup(db, user); + + db = CreateContext(); + var manager = CreateManager(db); + var userByEmail = await manager.FindByEmailAsync(user.Email); + Assert.Equal(2, (await manager.GetClaimsAsync(userByEmail)).Count); + Assert.Equal(1, (await manager.GetLoginsAsync(userByEmail)).Count); + Assert.Equal(2, (await manager.GetRolesAsync(userByEmail)).Count); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs b/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs index 431d8cd1a3..6e9c937274 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs @@ -265,18 +265,6 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test IdentityResultAssert.IsSuccess(await manager.DeleteAsync(user)); } - [Fact] - public async Task EnsureRoleClaimNavigationProperty() - { - var context = CreateContext(); - var roleManager = CreateRoleManager(context); - var r = new IdentityRole("EnsureRoleClaimNavigationProperty"); - IdentityResultAssert.IsSuccess(await roleManager.CreateAsync(r)); - var c = new Claim("a", "b"); - IdentityResultAssert.IsSuccess(await roleManager.AddClaimAsync(r, c)); - Assert.NotNull(r.Claims.Single(cl => cl.ClaimValue == c.Value && cl.ClaimType == c.Type)); - } - [Fact] public async Task AddUserToUnknownRoleFails() {