如何使用DbSet.Find()是否使用一个以抽象类为键的实体



我有一个抽象的TaxNumber类型,它由两种类型实现:2和CCD_ 3。

TaxNumber用作Person基本模型中的主键,CCD_5也是一种抽象类型,由两种类型实现:PhysicalPersonLegalPerson

知道:

PersonPhysicalPerson时,TaxNumberCPF

PersonLegalPerson时,TaxNumberCNPJ

问题是当我运行DbContext.Persons.Find(CPF)DbContext.Persons.Find(CNPJ)时。引发以下异常:

系统。ArgumentException:"对的调用的位置0处的键值"数据库集。Find"的类型为"CPF",与属性类型"TaxNumber"。

显然,传递给Find()的值必须完全是TaxNumber类型,但CPF0是抽象类型,无法实例化,在这种情况下如何使用Find()

为了更好地观看:

public abstract Person 
{
[Key]
public TaxNumber TaxNumber { get; set; }
}
public abstract LegalPerson : Person
{
}
public abstract PhysicalPerson : Person
{
}

定义了以下配置:

modelBuilder.Entity<LegalPerson>()
.Property(v => v.TaxNumber)
.HasConversion(
v => v.Unformatted,
v => v == null ? null : new CNPJ(v));
modelBuilder.Entity<PhysicalPerson>()
.Property(v => v.TaxNumber)
.HasConversion(
v => v.Unformatted,
v => v == null ? null : new CPF(v));

尝试将值强制转换为基类型:

DbContext.Persons.Find((TaxNumber)CPF)
DbContext.Persons.Find((TaxNumber)CNPJ)

更新:

或者尝试将值声明为基本类型:

TaxNumber key = CPF;
DbContext.Persons.Find(key);

更新2:

请尝试使用基元类型作为键。

EF Core支持使用任何基元类型的属性作为主键,包括stringGuidbyte[]和其他

参考:密钥类型和值

最新更新