EF Core 在执行具有非唯一记录的存储过程时出现“已添加具有相同键的项目”错误

问题描述 投票:0回答:1

我在通过 EF Core 执行存储过程时遇到问题。存储过程返回不唯一的记录,我遇到以下错误:

已添加具有相同密钥的项目。钥匙

我有一个自定义模型,定义如下:

public class CustomModel
{
    public int? ReglerObjekt { get; set; }
    public string Typ { get; set; }
    public int StatusNr { get; set; }
    // other properties...
}

在我的 DbContext 中,我配置了如下模型:

modelBuilder.Entity<CustomModel>(entity =>
{
    entity.ToTable("CustomModel");

    // Composite key configuration
    entity.HasKey(e => new { e.Id, e.Typ, e.StatusNr });

    // Property configurations
    entity.Property(e => e.ReglerObjekt).IsRequired(false);
    // other property configurations...
});

我正在使用 FromSqlRaw 调用存储过程:

Dim locTableContent = dbContext.CustomModel.FromSqlRaw("EXEC sp_xyz @Id, @globalId",
                     New SqlParameter("@Id", obj.Id),
                     New SqlParameter("@globalId", CType(globalId, Integer?))).AsNoTracking().ToList()

我尝试过的:

复合键:我尝试在模型配置中添加复合键以确保基于 Id、Typ 和 StatusNr 的唯一性,但错误仍然存在。

AsNoTracking:我还尝试添加 .AsNoTracking() 以避免 EF Core 跟踪问题,但这并没有解决问题。

HasNoKey : 实体.HasNoKey();

问题:

当存储过程返回非唯一记录时,如何解决 EF Core 中的“已添加具有相同键的项目”错误?有没有办法在 EF Core 中处理非唯一记录而不会遇到此错误?这对于您提供宝贵的意见或解决方案非常有用。

c# .net sql-server entity-framework asp.net-core
1个回答
0
投票

如果您需要读取数据行,无论是从表还是生成的包含完全非唯一行的数据,那么您应该使用 EF 以外的其他方式来读取这些行。您可以将

HasNoKey
与表或视图一起使用,因此您可能需要引入一个视图才能在 EF 中工作。使用 HasNoKey 时有许多规则,最值得注意的是不能使用 EF 更新、插入或删除行。根据我自己的测试,这也意味着使用
HasNoKey
定义的实体可以具有“out”导航属性,这意味着它们可以包含指向其他相关实体的导航属性,但它们似乎无法返回导航属性。

因此此 CustomModel 的实体配置应使用:

entity.ToView("vw_CustomModels")
    .HasNoKey();

如果有这些值的表,它可以使用

ToTable
,但它仍然会将其视为只读。仍然可以通过存储过程读取这些实体,但我相信您需要一个表定义或视图定义才能使映射器满意。这也意味着不需要像
.Required
这样的东西。没有通过该实体进行更新/插入。您可以定义
HasOne(x => x.Related).WithMany()
关系,但据我所知,它不能是
.WithMany(x => x.CustomModels)
,例如指向 CustomModel 的导航属性。

© www.soinside.com 2019 - 2024. All rights reserved.