【问题标题】:Why is EF Core 2.0 seemingly generating the wrong value?为什么 EF Core 2.0 似乎生成了错误的值?
【发布时间】: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


【解决方案1】:

发生这种情况的原因是我添加了带有硬编码值的实体。例如。 .Add(new Item(){Id = 1}) 我的假设是自动生成功能会识别这一点并相应地更新。我错了。

向@Ivan Stoev 提供cmets 中提供的信息的道具

【讨论】:

    猜你喜欢
    • 2018-03-29
    • 2021-08-19
    • 2022-01-13
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多