Итак, вот моя проблема ... то, что я пытаюсь создать, это самоотносящиеся отношения многих ко многим. В основном, вот моя модель.
public class InformationSystem
{
public InformationSystem()
{
Systems = new HashSet<InformationSystem>();
ParentSystems = new HashSet<InformationSystem>();
}
[Key()]
public int InformationSystemID { get; set; }
public string InformationSystemName { get; set; }
//Navigation properties
public virtual ICollection<InformationSystem> Systems { get; set; }
public virtual ICollection<InformationSystem> ParentSystems { get; set; }
}
Идея в том, что в системе может быть много родителей, а у родителя может быть много детей. Я знаю, как создать самореферентную сущность, где у многих детей может быть один родитель. То, что сбивает меня с толку, это много-много. Ниже мой DbContext.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<InformationSystem>(entity =>
{
entity
.HasMany(e => e.ParentSystems)
.WithMany(e => e.Systems)
.OnDelete(DeleteBehavior.Restrict);
});
Однако в моем DbContext я получаю сообщение об ошибке, которое .WithMany не содержит определения для многих, которые приняли бы ввод типа коллекции. Я знаю, что в основном необходимо создать таблицу ссылок, когда код сначала создает миграцию и обновляет базу данных. Таблица ссылок, я думаю, будет иметь два столбца и без ключа. Один столбец будет InformationSystemID, а другой - ParentInformationSystemID. Оба будут внешние ключи. Я также знаю, что для правильной работы поведение удаления должно быть ограничено, чтобы в случае удаления или обновления записи в таблице ссылок это изменение не каскадно (и создает al oop). Может кто-нибудь указать мне правильное направление, что мне нужно сделать, чтобы EF Core 3 сделал это правильно? Если бы мне пришлось самому создать таблицу ссылок, как бы я go сделал это? И что мне нужно сделать в моем DbContext? Я знаю, что таблица ссылок будет выглядеть примерно так:
Я был бы очень признателен.
public class InfoSysToParentInfoSys
{
public int InfoSysID;
public virtual InformationSystem InfoSys;
public int ParentInfoSysID;
public virtual InformationSystem ParentInfoSys;
}