EntityFramework не удается сохранить изменения без ошибок

#c# #entity-framework-core

#c# #entity-framework-core

Вопрос:

У меня есть AppUser класс, который передается из C # в Angular и обратно в C #.

AppUser Содержит ссылку на внешний ключ a Contact .

Contact Объект создается и передается обратно через Angular.

Однако, когда я вызываю context.SaveChanges() AppUser ссылку, ссылка Contact не обновляется. Ошибки не выдаются. Есть идеи, как устранить это?

 DbContext _ic = new DbContext(); //context declaration
public async Task<ActionResult<AppUser>> UpdateUser([FromBody]AppUser au)
{ //BREAKPOINT HERE TO CONFIRM THE au.EmailContact.Id<=0  IT IS
   try
   {
      if (au.EmailContact.Id <= 0)
         _ic.Contact.Add(au.EmailContact); //if contact was changed start tracking the new one
      if (au.PhoneContact.Id <= 0)
         _ic.Contact.Add(au.PhoneContact);

      _ic.SaveChanges(); //generates ID for phone/email contact
   }
   catch (Exception e)
   { //BREAKPOINT HERE
   }
}
  

Комментарии:

1. И вы это проверили, au.EmailContact и au.PhoneContact оба не являются нулевыми?

2. Вы await вводите свой вызов UpdateUser() ? Если вы этого не сделаете, есть вероятность, что ваше приложение может завершиться до завершения задачи. Особенно для консольных приложений

3. Если это шаблон отключенного контекста, вам, возможно, придется сообщить EF, что объект был явно изменен

4. @MickyD это хороший момент, я забыл добавить, что если я вызываю _ic.AppUser.Add(au), я получаю сообщение об ошибке, связанное с тем, что оно уже отслеживается. Я не экспериментировал с обновлением. Однако

5. …кстати, следует ли читать ваш пример кода .SaveChangesAsync() . Ваш UpdateUser() метод async , но не отображается асинхронный код

Ответ №1:

Вероятно, это связано с асинхронным ожиданием. Если вы правильно добавляете объекты и можете выбирать записи из _ic.Contact, то

 await _ic.SaveChangesAsync();
  

Комментарии:

1. Хорошее место, однако, потому что OP перечислил метод как async , я думаю, возможно, в его коде есть опечатка в том, что он на самом деле SaveChangesAsync уже использует. Это или у него там есть другой асинхронный код. В любом случае, я не думаю, что это проблема. Нужно будет дождаться его разъяснений выше