#c# #entity-framework #asp.net-core
#c# #entity-framework #asp.net-ядро
Вопрос:
Я пытаюсь добавить дочернюю сущность к родительской сущности. Дочерний User
объект, в то время как родительский объект CheckoutToken
:
Вставка CheckoutToken:
public async Task Insert(CheckoutToken model)
{
var checkoutToken = new Data.Models.CheckoutToken {
Token = model.Token,
License = _dbContext.Licenses.Single(l => l.Id == model.License.Id),
Created = model.Created,
Expires = model.Expires
};
checkoutToken.UserId = model.User.AspNetUserId;
checkoutToken.User = await _userManager.FindByIdAsync(model.User.AspNetUserId);
await _dbContext.CheckoutTokens.AddAsync(checkoutToken);
await _dbContext.SaveChangesAsync();
}
По какой-то причине я получаю это исключение:
Нарушение ограничения ПЕРВИЧНОГО КЛЮЧА ‘PK_AspNetUsers’. Невозможно вставить дубликат ключа в объект ‘dbo.AspNetUsers’. Повторяющееся значение ключа равно (73a0c19b-a7b1-4462-8e82-12be55e47002). Оператор был завершен.
Я не понимаю, почему он пытается создать пользователя?
Комментарии:
1. Из практики вы не должны назначать объекты своим моделям перед добавлением / обновлением их, как вы. Попробуйте удалить
checkoutToken.User = await _userManager.FindByIdAsync(model.User.AspNetUserId);
и посмотреть, поможет ли это вам. EF достаточно умен, чтобы сопоставлять любые подобные объекты, если идентификатор правильно указан как внешний ключ.
Ответ №1:
попробуйте прокомментировать эту строку:
public async Task Insert(CheckoutToken model)
{
var checkoutToken = new Data.Models.CheckoutToken {
Token = model.Token,
License = _dbContext.Licenses.Single(l => l.Id == model.License.Id),
Created = model.Created,
Expires = model.Expires
};
checkoutToken.UserId = model.User.AspNetUserId;
// checkoutToken.User = await _userManager.FindByIdAsync(model.User.AspNetUserId);
await _dbContext.CheckoutTokens.AddAsync(checkoutToken);
await _dbContext.SaveChangesAsync();
}
это потому, что вы пытаетесь создать нового пользователя с теми же данными существующего, если вам нужно назначить существующего пользователя новому объекту, назначьте только идентификатор пользователя, а не полный объект