在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();
}
}
传入数据:
我有正确的Memes ID记录问题。例如,我创建了一个Id = 4的内存,在表中HashTags应该为4,在我的情况下为0。
还有其他更好的解决方案来将标签保存在数据库中吗?我的解决方案好吗?
答案 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();
}
}