Настройка таблицы пересечений в 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);
Который является в основном последним разделом в ссылке, которую я предоставил в комментарии ранее. Я понятия не имею, как я пропустил это, когда я прочитал страницу в первый раз!