Изменение с ManyToMany на OneToMany Blazor ASP.NET

#c# #asp.net #entity-framework-core #blazor #.net-5

#c# #asp.net #сущность-структура-ядро #блейзор #.net-5

Вопрос:

Я пытался сохранить данные в таблице OneToMany (одно объявление, много тегов). Но в итоге я создал рабочий случай отношения ManyToMany, используя хороший ресурс. Как бы я воссоздал его с самого начала, основываясь на том, чего я достиг до сих пор? Есть некоторые вещи, которые я не смог полностью понять в моем случае с ManyToMany, поэтому изменить их немного сложно.

Фрагмент из рекламной модели:

 public class Advert
{
    public int Id { get; set; }
    public string Title { get; set; }
    public List<AdvertTag> AdvertTag { get; set; } = new List<AdvertTag>();
}
 

Модель тегов (я не уверен, что if (obj is Tag p2)... делает:

     public int Id { get; set; }
    public string Name { get; set; }
    public List<AdvertTag> AdvertTag { get; set; } = new List<AdvertTag>();

    public override bool Equals(object obj)
    {
        if (obj is Tag p2)
        {
            return Id == p2.Id;
        }
        return false;
    }
 

В моем компоненте формы я сохраняю данные, подобные этому:

 try
{
    await advertRepository.CreateAd(advert);
}
 

Я прикрепляю связанные теги. И я думаю { TagId = x.Id } , что передает идентификатор связанного тега (который уже существует в БД):

     private async Task OnDataAnnotationsValidated()
    {
        Advert.AdvertTag = SelectedTags
            .Select(x => new AdvertTag { TagId = x.Id }).ToList();

        await OnValidSubmit.InvokeAsync(null);
    }
 

AdvertController выполняет задание и сохраняет объявление, а также помещает идентификаторы как объявления, так и тега в промежуточную таблицу. Я думаю, что entity framework каким-то образом знает об отношении и сохраняет правильные теги, потому что в контроллере не указаны теги:

     [HttpPost]
    public async Task<ActionResult<int>> Post(Advert advert)
    {
        context.Add(advert);
        await context.SaveChangesAsync();
        return advert.Id;
    }
 

ApplicationDbContext :

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<AdvertTag>().HasKey(x => new { x.AdvertId, x.TagId });
}

public DbSet<Advert> Adverts { get; set; }
public DbSet<Tag> Tags { get; set; }
public DbSet<AdvertTag> AdvertsTags {get; set;}
 

До сих пор я писал новую модель тегов, которая включает в себя AdvertId:

 {
    public int Id { get; set; }
    public string Name { get; set; }
    public int AdvertId {get; set; }
    public Advert Advert {get; set;}
}
 

И добавил одну строку в рекламную модель:

 public List<Tag> Items { get; set; } = new List<Tag>();
 

И эта строка в ApplicationDbContext:

 modelBuilder.Entity<Tag>().HasKey(x => new { x.AdvertId});
 

Я не уверен, как передать идентификатор объявления, которое я создаю, в таблицу тегов:

 public List<Tag> SelectedItems { get; set; } = new List<Tag>();
...

try
{
    advert.Tags = SelectedItems;
    await advertRepository.CreateAd(advert);
}
 

Я получаю эти ошибки:

  1. Идентификаторы тегов отображаются в столбце AdvertId.
  2. Идентификатор объявления появляется в новом столбце, который Entity Framework создала сама AdvertId1.