C# EF core正在尝试更新我尚未指定的表

C# EF core正在尝试更新我尚未指定的表,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我有一门课叫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 Baske

我有一门课叫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));
}
[授权]
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务添加(int productId)
{
字符串userId=userManager.GetUserId(用户);
IdentityUser IdentityUser=await accountManager.GetCurrentUserAsync(userId);
Basket Basket=wait basketManager.GetUserBasketAsync(identityUser);
等待basketManager.AddProductToBasketAsync(productId,basket);
返回重定向到操作(名称(索引));
}
致电客户经理:

public async Task<IdentityUser> GetCurrentUserAsync(string accountId)
{
    if (!(String.IsNullOrEmpty(accountId) || String.IsNullOrWhiteSpace(accountId)))
        return await accountRepository.GetCurrentUserAsync(accountId);
    else throw new ArgumentNullException();
}
公共异步任务GetCurrentUserAsync(字符串accountId) { if(!(String.IsNullOrEmpty(accountId)| String.IsNullOrWhiteSpace(accountId))) 返回wait accountRepository.GetCurrentUserAsync(accountId); else抛出新ArgumentNullException(); } 账户回购

public async Task<IdentityUser> GetCurrentUserAsync(string accountId)
{
    var task = Task.Run(() => context.Users.Where(x => x.Id == accountId).FirstOrDefault());
    return await task;
}
公共异步任务GetCurrentUserAsync(字符串accountId) { var task=task.Run(()=>context.Users.Where(x=>x.Id==accountId.FirstOrDefault()); 返回等待任务; } 篮下经理电话

public async Task<Basket> GetUserBasketAsync(IdentityUser identityUser)
{
    if (identityUser != null)
        return await basketRepository.GetUserBasketAsync(identityUser);
    else throw new ArgumentException();
}
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);
}
公共异步任务GetUserBasketAsync(IdentityUser IdentityUser) { if(identityUser!=null) 返回wait wait basketRepository.GetUserBasketAsync(identityUser); 否则抛出新的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<Product> GetProductByIdAsync(int? id)
{
    return await context.Products.SingleOrDefaultAsync(x => x.ProductId == id);
}
公共异步任务GetUserBasketAsync(IdentityUser IdentityUser) { //Include方法返回相关实体。 var task=task.Run(()=>context.Basket.Include(x=>x.IdentityUser).Where(x=>x.IdentityUser.Id==IdentityUser.Id).SingleOrDefault()); 返回等待任务; } 篮加经理电话

public async Task<Basket> GetUserBasketAsync(IdentityUser identityUser)
{
    if (identityUser != null)
        return await basketRepository.GetUserBasketAsync(identityUser);
    else throw new ArgumentException();
}
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异步任务AddProductToBasketAsync(int-productId,Basket-Basket)
{
if(basket==null)
抛出新ArgumentException();
Product Product=wait productManager.GetProductByIdAsync(productId);
如果(产品==null)
抛出新异常(“无法检索产品”);
return wait basketRepository.AddProductToBasketAsync(产品,篮子);
}
产品经理电话

public async Task<Product> GetProductByIdAsync(int? id)
{
    return await productRepository.GetProductByIdAsync(id);
}
公共异步任务GetProductByIdAsync(int?id)
{
返回wait-productRepository.GetProductByIdAsync(id);
}
产品回购电话

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<Product> GetProductByIdAsync(int? id)
{
    return await context.Products.SingleOrDefaultAsync(x => x.ProductId == id);
}
公共异步任务GetProductByIdAsync(int?id)
{
返回wait context.Products.SingleOrDefaultAsync(x=>x.ProductId==id);
}

实体框架似乎没有将
ApplicationUser
视为已经存在的实体。我建议您在模型中明确说明,不要让模型自行决定:

public class BasketItem
{
    [Key]
    public int BasketItemId { get; set; }

    // add the actual columns
    public int ProductId { get; set; }    
    public int BaskedId { get; set; }

    public Product Product {get;set;}
    public Basket Basket {get; set; }
}

public class Basket
{
    [Key]
    public int BasketId { get; set; }

    // I believe it's a string but it could be a System.Guid instead
    public string IdentityUserId { get; set; }

    public IdentityUser IdentityUser { get; set; }
}
这也可能是由于不正确使用
GetUserBasketAsync
中的任务并行库造成的。我建议您删除对
任务的调用。运行
并使用Entity Framework提供的正确异步方法:

// async modifier not needed here
public Task<Basket> GetUserBasketAsync(IdentityUser identityUser)
{
    //Include method returns related Entity. 
    return context.Basket
        .Include(x => x.IdentityUser)
        .Where(x => x.IdentityUser.Id == identityUser.Id)
        // use the asynchronous version instead of the synchronous one
        .SingleOrDefaultAsync();
}

请为整个调用添加代码(从控制器操作到发布的方法)。您是如何创建产品和篮子变量的?当进入
addProductToBaseTaseSync
方法时,它们有什么值?EF是否有可能认为
basket
及其关联的是全新的实体?作为一个测试,而不是设置代码> BaskTimeTest.Base<代码>考虑添加<代码> BasketId < /Cord>属性并设置它。“CAMIOLTEVITO添加了所有的内容,这有点混乱,因此我最初排除。调试时,篮子和产品实体完全填充了正确的information@DavidG我会给你的
BasketItemId
一个自动递增字段吗?请检查。谢谢,这听起来是可行的。我会这样做的。