C# EF core正在尝试更新我尚未指定的表
我有一门课叫BasketItemC# 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
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
一个自动递增字段吗?请检查。谢谢,这听起来是可行的。我会这样做的。