Во фронтенде в Angular я сделал возможность добавления тегов и мемов. В бэкэнде в веб-API я хотел бы сохранить теги в базе данных. Сначала, используя код Entity Framework, я создал структуру из трех таблиц:
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();
}
}
Входящие данные:
У меня проблема с правильной записью идентификатора мемов. Например, я создал мем, у которого Id = 4, а в таблице HashTags должно быть 4, а в моем случае 0.

Есть ли другое лучшее решение для сохранения тегов в базе данных? Мое решение хорошее?





Просто добавить созданный экземпляр в модель контекстной сущности недостаточно db.MemesModel.Add(mem);. Значение идентификатора не будет сгенерировано, если вы не вызовете для него SaveChanges(). В приведенном ниже коде еще нет значения идентификатора, и поэтому вы наблюдаете
var hashTag = new HashTag()
{
MemesId = mem.Id,
Name = item
};
@k_dadun См. мой пересмотренный ответ для примера решения с использованием вашего собственного кода :)
Да, дело в том, что, поскольку вы сначала не сохранили мем, у него нет идентификатора, когда вы добавляете его в хэштег.
Если вы хотите сделать это таким образом, вы должны сделать HashTag членом в виде списка (свойства) в памяти. Затем при создании объектов HashTag не добавляйте идентификатор участника. Просто добавьте Mem в базу данных, и EF позаботится о структуре объекта.
(На моем телефоне, утром сделаю пример кода, если меня никто не опередит)
Обновлено: Вот как я бы это сделал:
С уважением: отбросьте класс Memes_tags, так как кажется, что он вообще не имеет смысла. Это просто работает как связь между мемами и хештегами, но это уже существует.
В целях наилучшей практики, по крайней мере, в соответствии с Собственный документ MS по EF "начало работы" идентификатор класса должен называться: <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». Идея состоит в том, что вместо того, чтобы добавлять идентификатор «мемы» в хэштег, мы просто добавляем хэштеги в объект мема, таким образом, они также добавляются в EF, и когда запись «мемы» добавляется в базу данных, 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);я добавилdb.SaveChanges ();Теперь он работает нормально, но я не знаю, следует ли правильно использовать дваdb.SaveChanges ();в одном методе