我有一个使用 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; }
}
背景
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 认为评估器列是关键,尽管我没有这么指定。这是怎么发生的以及我如何告诉它这不是钥匙?
在 EF Core 6.0 中,我在执行
add-migration
时遇到了这个错误。我重命名了一个类,这应该会导致重命名表的迁移。
当我一次重命名类和所有属性时,它不起作用,但当我将所有属性重命名为新名称并然后创建迁移,并在创建迁移之后重命名类时,它确实起作用。
这
最有可能从 EF 或相关的某个地方冒出一个 C# 异常,如果我不得不大胆猜测,我的第一个预感是你可能会从结果中多次返回“Assessor”列由 pr_ExecuteFacilityQCRules 存储过程返回的集合。 然而,这只是一个猜测 - 一个简单的测试是在 SQL 客户端中执行该过程并查看返回的列。在 C# 中,您通常会通过尝试将多个重复的键名添加到字典或类似内容(即 myDictionary.Add(key))来看到这种类型的异常。
如果情况并非如此,我认为需要添加更多信息来帮助诊断,而不仅仅是猜测。
将 EF Core 更新到 6.0.2 修复了该问题,并运行相同的迁移,没有任何问题。
View 或 stored procedure 提取数据,请确保 在 SQL 中未定义或使用两次具有相同名称的同一列 创建视图或创建过程。