#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
уже использует. Это или у него там есть другой асинхронный код. В любом случае, я не думаю, что это проблема. Нужно будет дождаться его разъяснений выше