Microsoft.EntityFrameworkCore.DbUpdateException - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть таблица комментариев, в которой есть два внешних ключа (т. Е. Userid и postid).Я пытался вставить данные в таблицу комментариев, используя эти два внешних ключа, но не смог вставить.Это моя таблица сообщений

public class Post
  {
    public int Id { get; set; }
    public string PostText { get; set; }
    public string Title { get; set; }
    public bool Status { get; set; }
    public DateTime PostDate { get; set; }
    public virtual List<Comment> Comments { get; set; }
    public ApplicationUser ApplicationUser { get; set; }
  }

И это моя таблица комментариев

public class Comment
  {
    public int Id { get; set; }
    public string CommentText { get; set; }
    public DateTime CommentTime { get; set; }
    public bool Status { get; set; }
    public ApplicationUser CommentBy { get; set; }
    public Post Posts { get; set; }
  }

Служба комментариев

public void Save(Comment comment)
    {
      _context.Set<Comment>().Add(comment);
      _context.SaveChanges();
    }

А это мой контроллер

[HttpPost]
    public ObjectResult SaveComment([FromBody] Comment comment)
    {
      if (ModelState.IsValid)
      {
        try
        {
          _commentService.Save(comment);
          return Ok("comment saved");
        } catch (Exception e)
        {
          return BadRequest(e);
        }
      } else
      {
        return BadRequest("Model is not valid");
      }
    }

И ошибка

{Microsoft.EntityFrameworkCore.DbUpdateException: при обновлении записей произошла ошибка.Смотрите внутреннее исключение для деталей.---> System.Data.SqlClient.SqlException: нарушение ограничения PRIMARY KEY 'PK_AspNetUsers'.Невозможно вставить повторяющийся ключ в объект 'dbo.AspNetUsers'.Значение ключа-дубликата: (966fc417-8757-4bac-89b2-9975d4f2cd41).

Невозможно вставить явное значение для столбца идентификаторов в таблице 'Posts', когда для IDENTITY_INSERT установлено значение OFF.

Операторбыло прекращено.

это мой запрос API enter image description here

1 Ответ

0 голосов
/ 06 декабря 2018

Причина в том, что вы также вставите новый 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 для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...