Да, дело в том, что, поскольку вы не сохранили мем в первую очередь, у него нет идентификатора, когда вы добавляете его в хэштег.
Если вы хотите сделать это таким образом, вы должны сделать 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();
}
}