【发布时间】:2021-04-28 21:50:44
【问题描述】:
我有一个用例,其中第三方提供了我希望使用 EF Core 合并到数据库中的项目的枚举。存在第三方在枚举中多次提供具有相同键的项目的用例。
| Id | Account | LastPayment |
|---|---|---|
| 12345 | ABC123 | 1/1/2021 |
| 23456 | BCD234 | 2/1/2021 |
| 12345 | ABC123 | 2/1/2021 |
理想情况下,我希望同时更新 12345(我们在数据层审核历史记录)。
尝试将 12345 两次添加到同一上下文时出现错误。代码 POC 为:
[Fact]
public async Task HandlesDuplicateKeys()
{
var services = new ServiceCollection()
.AddDbContext<ItemContext>(options => options.UseInMemoryDatabase(Guid.NewGuid().ToString()))
.BuildServiceProvider();
var items = new List<ItemA>()
{
new ItemA() { Id = 1, A = "Foo" },
new ItemA() { Id = 1, A = "Bar" }
};
using (var context = services.GetRequiredService<ItemContext>())
{
context.AList.AddRange(items);
await context.SaveChangesAsync();
}
}
public class ItemA
{
public int Id { get; set; }
public string? A { get; set; }
}
public class ItemContext : DbContext
{
public RepositoryContext(DbContextOptions<RepositoryContext> options) : base(options)
{ }
public DbSet<ItemA> AList { get; set; }
}
产量:
消息: System.InvalidOperationException :无法跟踪实体类型“ItemA”的实例,因为已经在跟踪具有相同键值 {'Id'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。
管理此用例的适当方法是什么?
【问题讨论】: