Добавить данные в таблицу со многими отношениями ко многим - PullRequest
0 голосов
/ 30 октября 2019

Мне просто нужно создать новую статью со многими ко многим отношениям для тегов. У меня есть 3 таблицы:

 public class Article
{        
    public int Id {get; set; }

    public string Name { get; set; }
    public string ShortDescription { get; set; }
    public string Description { get; set; }
    public byte[] HeroImage { get; set; }        
    public DateTime Date { get; set; }
    public string Category { get; set; }


    public virtual List<ArticleTag> ArticlesTags { get; set; }
    public Article()
    {
        ArticlesTags = new List<ArticleTag>();
    }
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual List<ArticleTag> ArticlesTags { get; set; }

    public Tag()
    {
        ArticlesTags = new List<ArticleTag>();
    }
}

public class ArticleTag
{
    public int ArticleId { get; set; }
    public Article Article { get; set; }

    public int TagId { get; set; }
    public Tag Tag { get; set; }
}

Это мой контроллер:

 public IActionResult CreateNewArticle()
    {
        return View();
    }
    [HttpPost]
    public async Task<IActionResult> CreateNewArticle(ArticlesView av)
    {


        Article artical = new Article { Name = av.Name, Category = av.Category,
            ShortDescription =av.ShortDescription, Description=av.Description, Date = av.Date };


           // some code to add Tags from View


        db.Add(artical);
        await db.SaveChangesAsync();

        return RedirectToAction("AdminView");

Моя модель для создания:

public class ArticlesView
{
    public IEnumerable<Article> Articles { get; set; }
    public string Name { get; set; }      
    public string Category { get; set; } 
    public string ShortDescription { get; set; }
    public string Description { get; set; }
    public DateTime Date { get; set; }
    public IFormFile Image { get; set; }
}

}

ИView:

<form asp-action="CreateNewArticle" asp-controller="home" method="post" enctype="multipart/form-data">
<div class="form-group">
    <label asp-for="Name" class="control-label">The name of article</label>
    <input type="text" asp-for="Name" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="ShortDescription" class="control-label">Short description</label>
    <input type="text" asp-for="ShortDescription" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="Description" class="control-label">Description</label>
    <input type="text" asp-for="Description" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="Category" class="control-label">Category</label>
    <input type="text" asp-for="Category" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="Date" class="control-label">Date of creation</label>
    <input type="date" asp-for="Date" class="form-control" />
</div>

Как я понял, мне просто нужно добавить данные в мою 3-ю таблицу ArticleTag (ArticleId, TagId столбцы), но я не понимаю, какой тип данных должен вводиться в полях Viewи что я должен делать в моем контроллере. Заранее спасибо

1 Ответ

0 голосов
/ 31 октября 2019

Если вы хотите добавить новый Article и добавить существующие теги к статье и сохранить связь с таблицей базы данных ArticleTag, вы можете сослаться на следующее:

  1. Добавить List<int> Tags, чтобы сохранить идентификатор выбранных тегов в ArticlesVM

    public class ArticlesVM
    {
      public IEnumerable<Article> Articles { get; set; }
      public string Name { get; set; }
      public string Category { get; set; }
      public string ShortDescription { get; set; }
      public string Description { get; set; }
      public DateTime Date { get; set; }
      public List<int> Tags { get; set; }
    }
    

2.Получить существующие теги, а затем отобразить их в помощнике по тегам select

public IActionResult CreateNewArticle()
    {
        ViewBag.Tags = new SelectList( _context.Tags.ToList(),"Id","Name");
        return View();
    }

@model EFCoreManyToMany.Models.ArticlesVM

<form asp-action="CreateNewArticle" asp-controller="home" method="post" enctype="multipart/form-data">
<div class="form-group">
    <label asp-for="Name" class="control-label">The name of article</label>
    <input type="text" asp-for="Name" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="ShortDescription" class="control-label">Short description</label>
    <input type="text" asp-for="ShortDescription" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="Description" class="control-label">Description</label>
    <input type="text" asp-for="Description" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="Category" class="control-label">Category</label>
    <input type="text" asp-for="Category" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="Date" class="control-label">Date of creation</label>
    <input type="date" asp-for="Date" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="Tags" class="control-label"></label>
    <select asp-for="Tags" asp-items="@ViewBag.Tags" multiple></select>
</div>
  <input type="submit" value="Create"/>
</form>

3. Сохранение данных в базе данных

[HttpPost]
    public async Task<IActionResult> CreateNewArticle(ArticlesVM av)
    {
        Article artical = new Article
        {
            Name = av.Name,
            Category = av.Category,
            ShortDescription = av.ShortDescription,
            Description = av.Description,
            Date = av.Date

        };
       _context.Add(artical);

        foreach(var tagId in av.Tags)
        {
            var tag = _context.Tags.Find(tagId);
            ArticleTag articleTag = new ArticleTag { Article = artical, Tag = tag };
            _context.Add(articleTag);
        }
        await _context.SaveChangesAsync();

        return RedirectToAction("AdminView");
    }
...