#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);
}
Я получаю эти ошибки:
- Идентификаторы тегов отображаются в столбце AdvertId.
- Идентификатор объявления появляется в новом столбце, который Entity Framework создала сама AdvertId1.