实体框架抛出“已添加具有相同密钥的项目”

时间:2018-01-20 12:05:15

标签: c# entity-framework mariadb entity-framework-core

我遇到了这个例外:

  

已添加具有相同键的项目。关键:p2072

这是在将实体添加到SaveChanges后调用DbContext

奇怪的是它说“Key:p2072”,但它与我实体的任何键都不匹配。

主键配置如下:

modelBuilder.Entity<RequestEntity>().HasKey(e => new { e.Nif, e.Especialidad, e.Cuerpo });

其中:

  • Nif是string
  • Especialidad是int
  • Cuerpo Enum

您可以看到实体的完整定义。它如下:

public class RequestEntity
{
    public string Nif { get; set; }
    public Provincias Provincias { get; set; }
    public Cuerpo Cuerpo { get; set; }
    public int Especialidad { get; set; }
    public Estado Estado { get; set; }
    public Idiomas Idiomas { get; set; }
    public int Orden { get; set; }
}

Provicias,Cuerpo,Idiomas和Estado是Enums 。请注意,与其他实体没有任何关系,只有原始类型。

我很难调试这个,因为要添加+23,000个实体,似乎没有任何重复。

此外,它显示的关键(p2072)毫无意义。密钥中唯一的字符串是Nif,但没有匹配的Nif。

修改

这是堆栈跟踪:

  

在   System.ThrowHelper.ThrowAddingDuplicateWithKeyArgumentException(对象   密钥)在System.Collections.Generic.Dictionary 2.TryInsert(TKey key, TValue value, InsertionBehavior behavior) at System.Collections.Generic.Dictionary 2.添加(TKey密钥,TValue值)
  在   Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.CreateStoreCommand()   在   Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection   连接)   Microsoft.EntityFrameworkCore.Update.Internal.MySqlBatchExecutor.Execute(IEnumerable的1 commandBatches, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IReadOnlyList 1   条目)   Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1   entriesToSave)at   Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(布尔   acceptAllChangesOnSuccess)at   Microsoft.EntityFrameworkCore.DbContext.SaveChanges(布尔   acceptAllChangesOnSuccess)at   Microsoft.EntityFrameworkCore.DbContext.SaveChanges()at   Plugin.Clm.Importer.Importer.SaveNewResults(ImportResult results)

编辑2

SaveChanges之前,我已经把这一行:

        var duplicates = requestEntities.GroupBy(e=>new{e.Nif, e.Especialidad, e.Cuerpo}).Select(x=>new{x.Key, Count = x.Count()})
            .Where(x => x.Count > 1)
            .ToList();

有趣的是duplicates没有任何东西(0个元素)。发生了什么事?

1 个答案:

答案 0 :(得分:0)

(代表问题作者发布)

这恰好是我使用的Pomelo EF MySQL提供程序中的错误!更新到最新版本即可解决问题。