Я использую стандартное ядро платформы удостоверений и сущностей asp.net core 2.
Как настроены отношения User, Role и UserRole:
public sealed class User : IdentityUser<Guid>
{
public UserRole UserRole { get; set; }
}
public sealed class Role : IdentityRole<Guid>
{
public List<UserRole> UserRoles { get; set; }
}
public sealed class UserRole : IdentityUserRole<Guid>
{
public User User { get; set; }
public Role Role { get; set; }
}
Свободная конфигурация API:
protected override void ConfigureRelations(EntityTypeBuilder<UserRole> builder)
{
builder.HasOne(q => q.User)
.WithOne(q => q.UserRole)
.HasForeignKey<UserRole>(q => q.UserId);
builder.HasOne(q => q.Role)
.WithMany(q => q.UserRoles)
.HasForeignKey(q => q.RoleId);
}
Когда я пытаюсь получить список пользователей с их пользовательскими ролями:
context.Users.Include(q => q.UserRole).ToList();
Я получаю исключение времени выполнения некорректного сгенерированного t-sql:
Invalid column name 'UserId1'.
Invalid column name 'RoleId1'.
Invalid column name 'UserId1'.
и T-SQL:
SELECT
[a].[Id], [a].[AccessFailedCount], [a].[ConcurrencyStamp],
[a].[Email], [a].[EmailConfirmed], [a].[LockoutEnabled], [a].[LockoutEnd],
[a].[NormalizedEmail], [a].[NormalizedUserName], [a].[PasswordHash],
[a].[PhoneNumber], [a].[PhoneNumberConfirmed], [a].[SecurityStamp],
[a].[TwoFactorEnabled], [a].[UserName],
[u.UserRole].[UserId],
[u.UserRole].[RoleId],
[u.UserRole].[RoleId1],
[u.UserRole].[UserId1]
FROM [AspNetUsers] AS [a]
LEFT JOIN [AspNetUserRoles] AS [u.UserRole] ON [a].[Id] = [u.UserRole].[UserId1]
Как вы можете видеть, по какой-то причине ядро ef использовало несуществующие поля "UserId1" и "RoleId1" вместо "UserId" и "RoleId".
Есть идеи, почему это так и как это исправить?