Ef Core, составной ключ таблицы соединений «многие ко многим» с различными типами данных - PullRequest
0 голосов
/ 08 июня 2019

Как обеспечить составной ключ из двух свойств с разными типами данных? EF Core жалуется, что

Отношение между 'GroupUsers.Groups' и 'Group.GroupUsers' со свойствами внешнего ключа {'UserId': string} не может быть нацелено на первичный ключ {'GroupId': int}, поскольку оно не является совместимы. Настройте основной ключ или набор совместимых свойств внешнего ключа для этого отношения.

Мои таблицы имеют отношение многие ко многим с первичными ключами, которые различаются по типам, как показано ниже

public class Group
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int GroupId { get; set; }

    [Required]
    public string GroupName { get; set; }

    public ICollection<GroupUsers> GroupUsers { get; set; }
}

public class User
{
    [Key]
    public string UserId { get; set; }

    public string Email { get; set; }

    public ICollection<GroupUsers> GroupUsers { get; set; }
}

public class GroupUsers
{
    public string UserId { get; set; }

    public int GroupId { get; set; }

    [ForeignKey("GroupId")]
    public Group Groups { get; set; }

    [ForeignKey("UserId")]
    public User Users { get; set; }
}

Вот беглая сторона вещей, которые я забыл показать

     modelBuilder.Entity<GroupUsers>().HasKey(gu => new { gu.GroupId, gu.UserId});
     modelBuilder.Entity<GroupUsers>().HasOne(ub => ub.Users)
            .WithMany(x => x.GroupUsers).HasForeignKey(h => h.GroupId)
            .OnDelete(DeleteBehavior.SetNull);

      modelBuilder.Entity<GroupUsers>().HasOne(ub => ub.Groups)
            .WithMany(x => x.GroupUsers).HasForeignKey(h => h.UserId)
            .OnDelete(DeleteBehavior.Cascade);

1 Ответ

1 голос
/ 08 июня 2019

Увидев вашу свободную конфигурацию, похоже, что ваши HasForeignKey вызовы переключены.

Это должно быть:

modelBuilder.Entity<GroupUsers>().HasKey(gu => new { gu.GroupId, gu.UserId});
modelBuilder.Entity<GroupUsers>().HasOne(ub => ub.Users)
    .WithMany(x => x.GroupUsers).HasForeignKey(h => h.UserId)  // <-- change to this
    .OnDelete(DeleteBehavior.SetNull);

modelBuilder.Entity<GroupUsers>().HasOne(ub => ub.Groups)
    .WithMany(x => x.GroupUsers).HasForeignKey(h => h.GroupId)  // <-- change to this
    .OnDelete(DeleteBehavior.Cascade);
...