我有一个抽象的TaxNumber
类型,它由两种类型实现:2和CCD_ 3。
TaxNumber
用作Person
基本模型中的主键,CCD_5也是一种抽象类型,由两种类型实现:PhysicalPerson
和LegalPerson
。
知道:
当Person
是PhysicalPerson
时,TaxNumber
是CPF
。
当Person
是LegalPerson
时,TaxNumber
是CNPJ
。
问题是当我运行DbContext.Persons.Find(CPF)
或DbContext.Persons.Find(CNPJ)
时。引发以下异常:
系统。ArgumentException:"对的调用的位置0处的键值"数据库集。Find"的类型为"CPF",与属性类型"TaxNumber"。
显然,传递给Find()
的值必须完全是TaxNumber
类型,但CPF
0是抽象类型,无法实例化,在这种情况下如何使用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支持使用任何基元类型的属性作为主键,包括
string
、Guid
、byte[]
和其他
参考:密钥类型和值