EF добавление дочернего объекта к родительскому объекту

#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();
 }
  

это потому, что вы пытаетесь создать нового пользователя с теми же данными существующего, если вам нужно назначить существующего пользователя новому объекту, назначьте только идентификатор пользователя, а не полный объект