【发布时间】:2018-04-15 21:20:12
【问题描述】:
我正在使用 InMemoryDatabase 进行单元测试。在我的单元测试中,我通过 _context.Add(new Item(){Description="desciption"}). 将一些数据添加到派生的 DbContext 中
在我的测试中,我添加了一个新实体。我遇到了密钥冲突。
我的存储库方法
//Before this method runs _context.Item already has one Item with Id = 1 which I set up in my unit test.
public async Task CreateItem(ItemDM dm){
Item newItem = new Item(){Name = dm.RelatedItem.Process.Name}; //Id is zero here
_context.Add(newItem); // The Error happens here
_context.SaveChanges();
}
我收到的错误是“{"id"} 的相同键值已被添加。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。”
据我了解,EF Core 会适当地增加 Id,但似乎并非如此。
【问题讨论】:
-
我们需要你的 ef 设置,即 db 上下文,如果是 db 或 code,最好是 minimal reproducible example。我们不会变魔术,也绝对不会盲目猜测问题出在哪里;)
-
它很难,因为代码在不同的计算机上:/ -- 我会尝试更新一些......
-
如果首先使用数据库并在内存中进行测试,那么它不会自动递增键,因为该信息存在于实际数据库中。实体上是否有任何属性表明该键是自动递增的?
-
阅读这篇文章scottbrady91.com/Entity-Framework/…。我还在找官方文档
-
问题是您最初是如何添加 Id = 1 的项目的。我怀疑您手动提供了 Id = 1 而不是让 EF 自动生成它。在这种情况下,自动生成器将在第一次使用时生成 1,因此会生成重复键。不要为自动生成的列使用硬编码值作为数据种子,让 EF(或数据库)始终生成它们。
标签: c# entity-framework-core auto-generate