Как сохранить теги в базе данных c # - PullRequest
0 голосов
/ 07 апреля 2019

В интерфейсе Angular я создал возможность добавления тегов и мемов.В бэк-энде в веб-API я хотел бы сохранить теги в базе данных.Сначала используя код структуры сущностей, я создал структуру из трех таблиц:

public class Memes
{
    public int Id { get; set; }
    public string MemName { get; set; }
    public string UserId { get; set; }
    public string Image { get; set; }
    public List<Memes_tags> MemesIteam { get; set; }
}
public class HashTag
{
    public int Id { get; set; }
    public int MemesId { get; set; }
    public string Name { get; set; }
}
public class Memes_tags
{
    public int Id { get; set; }
    public int MemesId { get; set; }
    public int HashTagId { get; set; }
    public virtual Memes Memes { get; set; }
    public virtual HashTag HashTags { get; set; }
}

Затем я создал метод, который должен сохранять мемы и теги в базе данных:

    [HttpPost]
    [Route("api/Memes/AddMemes")]
    public IHttpActionResult CreateMemes([FromBody] MemHashTagsViewModel createMem)
    {
        ApplicationDbContext db = new ApplicationDbContext();

        if (createMem != null)
        {
            Memes mem = new Memes()
            {
                MemName = createMem.MemName,
                Image = createMem.Image,
                UserId = createMem.UserId
            };
            db.MemesModel.Add(mem);

            foreach (var item in createMem.HashTags)
            {
                var hashTag = new HashTag()
                {
                    MemesId = mem.Id,
                    Name = item
                };
                db.HashTags.Add(hashTag);
            }
            db.SaveChanges();
            return Ok();
        }
        else
        {
          return  NotFound();
        }
    }

Входящие данные:enter image description here У меня проблема с правильной записью Memes Id.Например, я создал mem с Id = 4, и в таблице HashTags должно быть 4, а в моем случае - 0. enter image description here

Есть ли какое-либо иное лучшее решение для сохранениятеги в базе данных?Мое решение хорошо?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Да, дело в том, что, поскольку вы не сохранили мем в первую очередь, у него нет идентификатора, когда вы добавляете его в хэштег.

Если вы хотите сделать это таким образом, вы должны сделать HashTag членом в форме списка (свойства) в mem. Затем при создании объектов HashTag не добавляйте идентификатор члена. Просто добавьте Mem в базу данных, и EF позаботится о структуре объекта.

(На моем телефоне утром сделаю пример кода, если меня никто не побьет)

РЕДАКТИРОВАТЬ: Вот как я бы это сделал:

С уважением: Отбросьте класс Memes_tags, поскольку их, похоже, вообще не имеет смысла иметь. Это просто работает как отношение между мемами и хэштегами, но оно уже существует.

В целях Передовой практики, по крайней мере, в соответствии с собственным документом MS 'get start' doc идентификатор класса должен быть назван: <class_name>Id, чтобы он также был «исправлен».

public class Memes
{
    public int MemesId { get; set; }
    public string MemName { get; set; }
    public string UserId { get; set; }
    public string Image { get; set; }
    public List<HashTag> HashTags { get; set; }
}
public class HashTag
{
    public int HashTagId { get; set; }
    public int MemesId { get; set; }
    public string Name { get; set; }

    public virtual Memes { get; set; }
}

Ниже приведено изменение «CreateMemes». Идея состоит в том, что вместо добавления идентификатора Memes к хэштегу, мы просто добавляем HashTags к объекту meme, таким образом, они также добавляются в EF, и когда запись 'Memes' добавляется в базу данных, EF также обязательно создаст хэштеги.

[HttpPost]
[Route("api/Memes/AddMemes")]
public IHttpActionResult CreateMemes([FromBody] MemHashTagsViewModel createMem)
{
    ApplicationDbContext db = new ApplicationDbContext();

    if (createMem != null)
    {
        Memes mem = new Memes()
        {
            MemName = createMem.MemName,
            Image = createMem.Image,
            UserId = createMem.UserId
        };

        foreach (var item in createMem.HashTags)
        {
            var hashTag = new HashTag()
            {
                Name = item
            };
            mem.HashTags.add(hashTag);
        }
        db.add(mem);

        db.SaveChanges();
        return Ok();
    }
    else
    {
        return  NotFound();
    }
}
1 голос
/ 07 апреля 2019

Недостаточно просто добавить созданный экземпляр в модель объекта контекста db.MemesModel.Add(mem);. Значение Id не генерируется, пока вы не вызовете SaveChanges(). В приведенном ниже коде еще нет значения Id, и то, что вы наблюдаете

            var hashTag = new HashTag()
            {
                MemesId = mem.Id,
                Name = item
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...