Причина в том, что вы также вставите новый comment.CommentBy
, когда вставляете совершенно новый comment
:
// the `comment` here is constructed by model binding, which is a brand new entity
[HttpPost]
public ObjectResult SaveComment([FromBody] Comment comment)
{
// ...
_commentService.Save(comment); // save the brand new comment
// ...
}
«Новый комментарий» означаетэта Comment
сущность и связанные с ней свойства все untracked
.При сохранении совершенно новой сущности EF Core
также автоматически создаст для вас связанные сущности.
Чтобы избежать такого поведения, вы можете пометить состояние comment.CommentBy
как Unchanged
,
_context.Entry(comment.CommentBy).State= EntityState.Unchanged;
чтобы ядро EF не создавало для вас новый CommentBy
(т. Е. ApplicationUser
).Но будьте осторожны: вы должны убедиться, что ApplicationUser
уже существует.
То же самое происходит Post
.
Другой подход намного безопаснее.Как подсказывает @Khai Nguyen в комментарии, вы должны получить экземпляр ApplicationUser
и Post
из базы данных, чтобы ядро EF знало, что в базе уже есть ApplicationUser
и Post
, и не вставило новый ApplicationUser
или Post
для вас.