gpt4 book ai didi

c# - Entity Framework Core 尝试在调用 SaveChanges() 时插入重复记录

转载 作者:行者123 更新时间:2023-11-30 20:32:34 25 4
gpt4 key购买 nike

我的实体是:

public class Customer
{
...
public virtual ICollection<ShoppingCartItem> ShoppingCartItems { get; set; }
...
}

public class ShoppingCartItem
{
public string CustomerId { get; set; }
public int ProductId { get; set; }
public virtual Customer { get; set; }
public virtual Product{ get; set; }
...
}

添加方法是:

public async Task AddAsync(TEntity entity)
{
await Task.Factory.StartNew(() => this.entities.Add(entity));
}

我要添加的实体是:

ShoppingCartItem()
{
CustomerId = "xxxxx",
ProductId = 1,
Customer = null,
Product = null
}

当我调用 SaveChanges() 时,EF 尝试为 ShoppingCartItem 插入两条相同的记录。 ShoppingCartItem 仅创建一次并添加到上下文中。有什么想法可能是错误的吗?

编辑:

这就是我调用 AddSync 方法的方式:

public async Task AddNewCartItem(ShoppingCartItem shopingCartItem)
{
await this.ShoppingCartItemRepository.AddAsync(shopingCartItem);
await this.SmartStoreWorkData.CompleteAsync();
}

最佳答案

DbContext not thread safe 。通过 - 毫无意义地,如评论中所述 - 执行你的 .Add()在很可能是不同的线程中,您混淆了 DbContextAdd()纯粹是内存操作;没有理由尝试使其异步。改变它,我认为它会解决问题。

public void Add(TEntity entity)
{
this.entities.Add(entity);
}

如果您的问题中未显示任何其他类似的用法,也请将它们更改为同步。

可以DbContext 进行“适当的”异步操作但它仅适用于实际与数据库对话的方法,而不是内存中的方法,并且通常不会涉及 Task.<anything> ,只是提供的async方法。

编辑:为了完整起见,上面的链接适用于 EF6,但在 EF Core 中,DbContext也是not thread-safe .

关于c# - Entity Framework Core 尝试在调用 SaveChanges() 时插入重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41199317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com