Настройка таблицы пересечений в EF Core 2.1.1

У меня довольно простая потребность, но я не могу понять, как это сделать с помощью ядра EF 2.1.1 в коде.

У меня есть стол Right и стол Role:

Role
public int RoleId { get; set; }
public string Name { get; set; }

Right  
public int RightId { get; set; }  
public string Name { get; set; }  

Обычно в стандартной базе данных я просто делаю таблицу пересечений Named:

RoleRights(RoleId int, RightId int)  

Но, похоже, в ядре 2.1.1 вы вместо этого добавляете свойства навигации.

Role
public int RoleId { get; set; }
public string Name { get; set; }
public IEnumerable<Right> Rights { get; set; } 

Right
public int RightId { get; set; }  
public string Name { get; set; } 
public IEnumerable<Role> Roles { get; set; } 

Role может содержать любое количество Right и Right может содержаться в любом количестве Role,

При выполнении:

modelBuilder.Entity<Role>().HasMany(r => r.Rights);
modelBuilder.Entity<Right>().HasMany(r => r.Roles);

Это выравнивает мой Role стол и добавить RightId вместо того, чтобы сделать таблицу пересечений. То же самое для Right Таблица. Добавляет RoleId,

в Migration сценарий:

migrationBuilder.AddColumn<int>(
    name: "RightId",
    table: "Roles",
    nullable: true);

migrationBuilder.AddColumn<int>(
    name: "RoleId",
    table: "Rights",
    nullable: true);
    migrationBuilder.AddForeignKey(
        name: "FK_Rights_Roles_RoleId",
        table: "Rights",
        column: "RoleId",
        principalTable: "Roles",
        principalColumn: "Id",
        onDelete: ReferentialAction.Restrict);

    migrationBuilder.AddForeignKey(
        name: "FK_Roles_Rights_RightId",
        table: "Roles",
        column: "RightId",
        principalTable: "Rights",
        principalColumn: "Id",
        onDelete: ReferentialAction.Restrict);

Как я могу настроить свою модель, чтобы вместо нее была таблица пересечений? В этом случае он генерирует неправильную схему. Я не могу вставить и очистить Role или Right в нет Role, Думая об этом, я, вероятно, никогда не должен этого делать, но мне это кажется странным.

Спасибо за ваше время!

Если что-то не понятно, скажите мне, что нужно более подробно, и я уточню!

1 ответ

Решение

Так что я следил за чем-то устаревшим. Решение состоит в том, чтобы явно создать таблицу соединений.

   public class RoleRight : IEntity
   {
      public int RoleId { get; set; }
      public Role Role { get; set; }

      public int RightId { get; set; }
      public Right Right { get; set; }
   }

И как Роль, и Роль выглядят так.

   public class Right : IEntity
   {
      public int Id { get; set; }
      public string Name { get; set; }
      public virtual List<RoleRight> RoleRights { get; set; }
   }

С этой конфигурацией на OnModelCreating

 modelBuilder.Entity<RoleRight>().HasKey(rr=> new { rr.RightId, rr.RoleId });
 modelBuilder.Entity<RoleRight>().HasOne(rr => rr.Right)
                                 .WithMany(r => r.RoleRights)
                                 .HasForeignKey(rr => rr.RightId);

 modelBuilder.Entity<RoleRight>().HasOne(rr => rr.Role)
                                 .WithMany(r => r.RoleRights)
                                 .HasForeignKey(rr => rr.RoleId);

Который является в основном последним разделом в ссылке, которую я предоставил в комментарии ранее. Я понятия не имею, как я пропустил это, когда я прочитал страницу в первый раз!

Другие вопросы по тегам