EF Core, Fluent API и отношения: проблема с некорректным генерируемым SQL - PullRequest
0 голосов
/ 07 января 2019

Я использую стандартное ядро ​​платформы удостоверений и сущностей 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".

Есть идеи, почему это так и как это исправить?

...