diff --git a/test/EFCore.AspNet.Specification.Tests/AspNetIdentityCustomTypesDefaultTestBase.cs b/test/EFCore.AspNet.Specification.Tests/AspNetIdentityCustomTypesDefaultTestBase.cs index bff030b3e6e..929f091dbda 100644 --- a/test/EFCore.AspNet.Specification.Tests/AspNetIdentityCustomTypesDefaultTestBase.cs +++ b/test/EFCore.AspNet.Specification.Tests/AspNetIdentityCustomTypesDefaultTestBase.cs @@ -63,6 +63,42 @@ await ExecuteWithStrategyInTransactionAsync( }); } + [ConditionalFact] + public async Task Can_lazy_load_User_navigations_many_to_many() + { + var userId = ""; + + await ExecuteWithStrategyInTransactionAsync( + async context => + { + var user = new CustomUserString { NormalizedUserName = "wendy" }; + await CreateUser(context, user); + userId = user.Id; + }, + async context => + { + var user = await context.Users.SingleAsync(u => u.Id == userId); + + Assert.Equal(2, user.Roles.Count); + }); + } + + [ConditionalFact] + public async Task Can_lazy_load_Role_navigations_many_to_many() + { + await ExecuteWithStrategyInTransactionAsync( + async context => + { + await CreateUser(context, new CustomUserString { NormalizedUserName = "wendy" }); + }, + async context => + { + var role = await context.Roles.OrderBy(e => e.NormalizedName).FirstAsync(); + + Assert.Equal(1, role.Users.Count); + }); + } + [ConditionalFact] public async Task Can_lazy_load_UserRole_navigations() { @@ -183,6 +219,10 @@ protected override List ExpectedMappings "Navigation: CustomRoleString.RoleClaims (ICollection) Collection ToDependent CustomRoleClaimString Inverse: Role PropertyAccessMode.Field", "Navigation: CustomRoleString.UserRoles (ICollection) Collection ToDependent CustomUserRoleString Inverse: Role PropertyAccessMode.Field", }, + SkipNavigations = + { + "SkipNavigation: CustomRoleString.Users (ICollection) CollectionCustomUserString Inverse: Roles PropertyAccessMode.Field" + } }, new EntityTypeMapping() { @@ -248,7 +288,7 @@ protected override List ExpectedMappings { "Navigation: CustomUserRoleString.Role (CustomRoleString) ToPrincipal CustomRoleString Inverse: UserRoles PropertyAccessMode.Field", "Navigation: CustomUserRoleString.User (CustomUserString) ToPrincipal CustomUserString Inverse: UserRoles PropertyAccessMode.Field", - }, + } }, new EntityTypeMapping() { @@ -285,6 +325,10 @@ protected override List ExpectedMappings "Navigation: CustomUserString.Tokens (ICollection) Collection ToDependent CustomUserTokenString Inverse: User PropertyAccessMode.Field", "Navigation: CustomUserString.UserRoles (ICollection) Collection ToDependent CustomUserRoleString Inverse: User PropertyAccessMode.Field", }, + SkipNavigations = + { + "SkipNavigation: CustomUserString.Roles (ICollection) CollectionCustomRoleString Inverse: Users PropertyAccessMode.Field" + } }, new EntityTypeMapping() { @@ -328,6 +372,12 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.Entity( b => { + b.HasMany(e => e.Roles) + .WithMany(e => e.Users) + .UsingEntity( + j => j.HasOne(e => e.Role).WithMany(e => e.UserRoles).HasForeignKey(e => e.RoleId), + j => j.HasOne(e => e.User).WithMany(e => e.UserRoles).HasForeignKey(e => e.RoleId)); + b.HasMany(e => e.Claims).WithOne(e => e.User).HasForeignKey(uc => uc.UserId).IsRequired(); b.HasMany(e => e.Logins).WithOne(e => e.User).HasForeignKey(ul => ul.UserId).IsRequired(); b.HasMany(e => e.Tokens).WithOne(e => e.User).HasForeignKey(ut => ut.UserId).IsRequired(); @@ -390,6 +440,8 @@ public CustomUserString() public string CustomTag { get; set; } + public virtual ICollection Roles { get; set; } + public virtual ICollection Claims { get; set; } public virtual ICollection Logins { get; set; } public virtual ICollection Tokens { get; set; } @@ -403,6 +455,8 @@ public CustomRoleString() Id = Guid.NewGuid().ToString(); } + public virtual ICollection Users { get; set; } + public virtual ICollection UserRoles { get; set; } public virtual ICollection RoleClaims { get; set; } }