如何在数据库C#中保存标签

时间:2019-04-07 20:46:30

标签: c# asp.net asp.net-web-api

在Angular的前端中,我创建了添加标签和模因的可能性。在Web 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记录问题。例如,我创建了一个Id = 4的内存,在表中HashTags应该为4,在我的情况下为0。 enter image description here

还有其他更好的解决方案来将标签保存在数据库中吗?我的解决方案好吗?

2 个答案:

答案 0 :(得分:1)

仅将创建的实例添加到上下文实体模型是不够的db.MemesModel.Add(mem);。除非您调用SaveChanges(),否则不会生成ID值。在您的以下代码中,尚无Id值,因此您观察到的情况

            var hashTag = new HashTag()
            {
                MemesId = mem.Id,
                Name = item
            };

答案 1 :(得分:1)

是的,事实是:由于您没有先保存mem,因此将其添加到主题标签时它没有ID。

如果您希望这样做,则应使HashTag成为成员,并以内存上的列表(属性)的形式。然后,在创建HashTag对象时,不要添加成员ID。只需将Mem添加到数据库中,EF就会处理对象结构。

(在我的手机上,如果没人殴打我,他会在早上做一个代码示例)

编辑:这是我的做法:

尊敬地:删除Memes_tags类,因为它们似乎根本没有意义。它只是作为Memes和HashTags之间的关系,但是已经存在。

出于最佳实践的目的,至少应根据MS's own EF 'get start' doc将该类的ID命名为:<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'的ID添加到hashtag中,而是仅将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();
    }
}