У меня есть класс BasketItem
public class BasketItem
{
[Key]
public int BasketItemId { get; set; }
public Product Product {get;set;}
public Basket Basket {get; set; }
}
Там есть ссылка на два других класса.Продукт и корзина.
public class Basket
{
[Key]
public int BasketId { get; set; }
public IdentityUser IdentityUser { get; set; }
}
Корзина содержит Id и ссылку на IdentityUser
Однако я получаю это исключение, когда запускаю код.
Я не понимаю, почему он пытается обновить таблицу IdentiyUser с помощью дубликата учетной записи, я только пытаюсь обновить таблицу BasketItem.
Исходный код вызова
[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Add(int productId)
{
string userId = userManager.GetUserId(User);
IdentityUser identityUser = await accountManager.GetCurrentUserAsync(userId);
Basket basket = await basketManager.GetUserBasketAsync(identityUser);
await basketManager.AddProductToBasketAsync(productId, basket);
return RedirectToAction(nameof(Index));
}
Позвонить менеджеру по работе с клиентами:
public async Task<IdentityUser> GetCurrentUserAsync(string accountId)
{
if (!(String.IsNullOrEmpty(accountId) || String.IsNullOrWhiteSpace(accountId)))
return await accountRepository.GetCurrentUserAsync(accountId);
else throw new ArgumentNullException();
}
Репо счета
public async Task<IdentityUser> GetCurrentUserAsync(string accountId)
{
var task = Task.Run(() => context.Users.Where(x => x.Id == accountId).FirstOrDefault());
return await task;
}
Позвонить менеджеру корзины
public async Task<Basket> GetUserBasketAsync(IdentityUser identityUser)
{
if (identityUser != null)
return await basketRepository.GetUserBasketAsync(identityUser);
else throw new ArgumentException();
}
Позвонить в корзину репо
public async Task<Basket> GetUserBasketAsync(IdentityUser identityUser)
{
//Include method returns related Entity.
var task = Task.Run(() => context.Basket.Include(x => x.IdentityUser).Where(x => x.IdentityUser.Id == identityUser.Id).SingleOrDefault());
return await task;
}
Звонок менеджера добавления корзины
public async Task<int> AddProductToBasketAsync(int productId, Basket basket)
{
if (basket == null)
throw new ArgumentException();
Product product = await productManager.GetProductByIdAsync(productId);
if (product == null)
throw new Exception("Could not retrieve product");
return await basketRepository.AddProductToBasketAsync(product, basket);
}
Звонок менеджера продукта
public async Task<Product> GetProductByIdAsync(int? id)
{
return await productRepository.GetProductByIdAsync(id);
}
Звонок репо продукта
public async Task<Product> GetProductByIdAsync(int? id)
{
return await context.Products.SingleOrDefaultAsync(x => x.ProductId == id);
}