Entity Framework Core 3.1.6 已添加具有相同键的项目

mac*_*mac 3 c# sql-server asp.net-mvc entity-framework-core .net-core

我有一个使用 Entity Framework 3.1.6 的 .NET Core 3.1 中的 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; }
}
Run Code Online (Sandbox Code Playgroud)

语境

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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

表结构

在此输入图像描述

当到达以下行时,它会抛出错误:

var result = await context.FacilityQCResults.FromSqlRaw(" exec [dbo].[pr_ExecuteFacilityQCRules]").ToListAsync();
Run Code Online (Sandbox Code Playgroud)

存储过程执行一些其他操作并输出对表结构进行建模的数据行。有趣的是,我有另一个设置类似的对象,运行没有问题。这个似乎直到最近才起作用,但我不确定这种情况何时开始发生或为什么,因为我没有更改对象或表结构。基本上,EF Core 认为评估器列是关键,尽管我没有这么指定。这是怎么发生的以及我如何告诉它这不是钥匙?

Mca*_*nic 11

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

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

  • 我的 ef core 6.0 也有同样的问题。只是我试图删除两张桌子。解决方案分两步进行。 (2认同)

boy*_*dc7 7

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

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

如果情况并非如此,我认为需要添加更多信息来帮助诊断,而不仅仅是猜测。

  • 我是个白痴。我实际上怀疑它是 ac# 异常,但甚至没有想到查看返回的列是否有重复项。看来我不小心将评估者列两次添加到退货中。太感谢了! (3认同)
  • 就我而言,我使用的存储过程两次返回“无列名”,因为它们是某人匿名的聚合列...... (2认同)

小智 5

我在创建迁移时遇到了同样的问题,并通过从 6.0.1 升级到 6.0.3 解决了该问题。