我在通过 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 中处理非唯一记录而不会遇到此错误?这对于您提供宝贵的意见或解决方案非常有用。
如果您需要读取数据行,无论是从表还是生成的包含完全非唯一行的数据,那么您应该使用 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 的导航属性。