已添加具有相同键的实体框架核心 3.1.6 项

Posted

技术标签:

【中文标题】已添加具有相同键的实体框架核心 3.1.6 项【英文标题】:Entity Framework Core 3.1.6 Item With Same Key Has Already Been Added 【发布时间】:2020-11-23 22:31:41 【问题描述】:

我在 .NET Core 3.1 中有一个使用 Entity Framework 3.1.6 的 MVC 网站。我的问题是我的一个实体现在抛出错误:

System.ArgumentException:已添加具有相同键的项目。关键:评估员

直到最近它都运行良好,但我不确定发生了什么变化。

型号

public class FacilityQCResult

    [Key]
    public int ID  get; set; 
    public Guid? QCID  get; set; 
    public string QCSeverity  get; set; 
    public string QCType  get; set; 
    public string QCShortName  get; set; 
    public string Resolution  get; set; 
    public string Base  get; set; 
    public string FacilityNumber  get; set; 
    public string FacilityName  get; set; 
    public DateTime? DataEntryComplete  get; set; 
    public string TeamAssignment  get; set; 
    public string Assessor  get; set; 
    public string TripWeek  get; set; 
    public string Details  get; set; 
    public Guid? FacilityID  get; set; 

上下文

public partial class SQLDBContext : DbContext

    public SQLDBContext()
    
    

    public SQLDBContext(DbContextOptions<SQLDBContext> options)
        : base(options)
    
    
    
    
    public virtual DbSet<FacilityQCResult> FacilityQCResults  get; set; 
    
 protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity<FacilityQCResult>(entity =>
        
            entity.ToTable("FacilityQCResult");
            entity.HasKey(e => e.ID);

            entity.Property(e => e.DataEntryComplete)
                .HasColumnName("Data_Entry_Complete")
                .HasColumnType("datetime");

            entity.Property(e => e.TeamAssignment)
                .HasColumnName("Team_Assignment")
                .HasMaxLength(100)
                .IsUnicode(false);

            entity.Property(e => e.TripWeek)
                .HasColumnName("Trip_Week")
                .HasMaxLength(10)
                .IsUnicode(false);
        );
    

表结构

当它到达以下行时会引发错误:

var result = await context.FacilityQCResults.FromSqlRaw(" exec [dbo].[pr_ExecuteFacilityQCRules]").ToListAsync();

存储过程做一些其他的事情,并吐出模拟表结构的数据行。有趣的是我有另一个设置类似的对象,运行没有问题。这个似乎直到最近才起作用,但我不确定这到底是什么时候开始发生的,或者为什么我没有更改对象或表结构。基本上,EF Core 认为 Assessor 列是一个关键,尽管我没有指定。这是怎么发生的?我怎么告诉它它不是钥匙?

【问题讨论】:

主键不是身份字段,是吗?如果没有,您如何管理这些价值观? 为什么QCID uniqueidentifier 而不是ID? 【参考方案1】:

在 EF Core 6.0 中,我在执行 add-migration 时遇到了这个错误。我重命名了一个类,这应该会导致重命名表的迁移。

当我一次重命名类和所有属性时它不起作用,但是当我将所有属性重命名为它们的新名称并然后创建迁移并重命名类时它确实起作用在创建迁移之后。

【讨论】:

我对 ef core 6.0 有同样的问题。只是我试图放下两张桌子。解决方案分两步完成。【参考方案2】:

这不太可能是与 SQL Server 相关的异常(即,我的印象是您认为该异常是由于 SQL 重复键异常而引发的,类似于您在尝试创建多行时会看到的情况具有重复的 PK 和/或唯一键/索引键)。如果是这种情况,您会看到不同的异常(可能是 SqlException 或相关异常)。

很可能是从 EF 或相关的某个地方冒出的 C# 异常,如果我不得不大胆猜测,我的第一个预感是你可能会得到“Assessor”从 pr_ExecuteFacilityQCRules 存储过程返回的结果集中多次返回的列。然而,这只是一个猜测——一个简单的测试是在 SQL 客户端中执行该过程并查看返回的列。您通常会在 C# 中通过尝试将多个重复的键名添加到字典或类似名称(即 myDictionary.Add(key))来看到这种类型的异常。

如果不是这样,我认为需要添加更多信息来帮助诊断,而不是猜测。

【讨论】:

我是个白痴。我实际上怀疑它是一个 c# 异常,但甚至没有考虑查看返回的列是否存在重复项。看来我不小心将 Assessor 列两次添加到退货中。非常感谢! 在我的例子中,我使用了一个两次返回“无列名”的存储过程,因为它们是有人匿名留下的聚合列......【参考方案3】:

我在 EF Core 6.0 中收到了同样的错误。

将 EF Core 更新到 6.0.2 解决了该问题,并且运行相同的迁移没有任何问题。

【讨论】:

以上是关于已添加具有相同键的实体框架核心 3.1.6 项的主要内容,如果未能解决你的问题,请参考以下文章

无法附加分离的实体:“ObjectStateManager 中已存在具有相同键的对象”

“ObjectStateManager 中已存在具有相同键的对象...”将实体状态设置为已修改时引发异常

已添加具有相同密钥的项目 - 仅处于发布模式

使用在多个列上具有主键的实体框架更新数据库

实体框架代码优先:具有两个外键的表

实体框架:如何从具有复合键的表中返回一行?