在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的mem,在表中HashTags应该是4,在我的例子中是0. 在数据库中保存标签还有其他更好的解决方案吗?我的解决方案是好的吗?
是的,事情是:因为你没有先保存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();
}
}
只是将创建的实例添加到上下文实体模型是不够的db.MemesModel.Add(mem);
。除非您在其上调用SaveChanges()
,否则不会生成Id值。这在你的下面的代码中没有Id值,所以你观察到的
var hashTag = new HashTag()
{
MemesId = mem.Id,
Name = item
};