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

问题描述 投票:0回答:2

在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的mem,在表中HashTags应该是4,在我的例子中是0. enter image description here 在数据库中保存标签还有其他更好的解决方案吗?我的解决方案是好的吗?

c# asp.net asp.net-web-api
2个回答
1
投票

是的,事情是:因为你没有先保存mem,所以当你将它添加到hashtag时它没有ID。

如果你想这样做,你应该以mem上的列表(属性)的形式使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();
    }
}

1
投票

只是将创建的实例添加到上下文实体模型是不够的db.MemesModel.Add(mem);。除非您在其上调用SaveChanges(),否则不会生成Id值。这在你的下面的代码中没有Id值,所以你观察到的

            var hashTag = new HashTag()
            {
                MemesId = mem.Id,
                Name = item
            };
© www.soinside.com 2019 - 2024. All rights reserved.