我当前使用的是 IBM.EntityFrameworkCore 版本 7.0.0.200。
我从数据库中选择一组记录。
该表有主键和另外 2 个备用键。我遇到问题的列 (SEQ_CD) 是备用键之一。它是一个smallint(2),不允许空值并且没有默认值。
我使用的API是.Net 7。
这是我的背景
modelBuilder.Entity<MyClass>(e =>
{
e.ToTable("Table", "Schema");
e.HasKey(k => k.Cd);
e.HasAlternateKey(k => k.Dc);
e.HasAlternateKey(k => k.SeqCd);
e.Property(p => p.CD).HasColumnName("CD");
e.Property(p => p.DT).HasColumnName("DT");
e.Property(p => p.SEQ_CD).HasColumnName("SEQ_CD").HasColumnType("smallint(2)");
e.Property(p => p.CD_DS).HasColumnName("CD_DS");
});
我的班级是这样设置的:
namespace Project.Data.Db2.Models
{
public partial class MyClass
{
public string Cd { get; set; }
public DateTime fDt { get; set; }
public short SeqCd { get; set; }
[JsonConverter(typeof(TrimmedWhitespaceStringConverter))] //Used to trim the extra whitespace from the db2 character fields.
public string CD_DS{ get; set; }
}
}
根据以前的经验,我认为这是将类型从 Db2 转换为 .Net 的问题。我检查了数据类型转换表,并尝试了 Int16。我也尝试过 Short,因为这是我们正在用新项目更新的其他应用程序所使用的类型。
无论我保存什么值,当我检索该值时,SEQ_CD 都会返回 1。我已验证数据库中的值是否正确。此外,我还设置了 api 来转储生成的 linq,并且使用 linqpad 从 linq 生成 sql。当直接针对数据库运行时,这两个查询都会返回正确的值,并返回预期的结果集。我需要在我的上下文或课堂上添加一些内容吗?
蒂亚!
我终于能够使用 IBM.EntityFrameworkCore 提供程序生成上下文。一旦我这样做了,我就能够注释掉各个部分,直到我破坏它,然后将部分添加到我现有的部分,直到它起作用。
我了解到我的问题是备用键设置。
不能使用
.HasAlternateKey
,而必须这样做:
e.HasKey(k => new { k.Cd, k.Dt, k.SeqCd });
一旦我这样做了,它就会从我的 api 返回正确的值。