我有一个抽象的TaxNumber
类型,它由两种类型实现:CPF
和CNPJ
。
[TaxNumber
用作Person
基本模型中的主键,它也是一种抽象类型,并且由以下两种类型实现:PhysicalPerson
和LegalPerson
。
知道:
[当Person
为PhysicalPerson
时,TaxNumber
为CPF
。
[当Person
为LegalPerson
时,TaxNumber
为CNPJ。
问题是当我运行DbContext.Persons.Find(CPF)
或DbContext.Persons.Find(CNPJ)
时。引发以下异常:
System.ArgumentException:'在调用位置0处的键值'DbSet。查找“类型为'CPF',与属性类型'TaxNumber'。
显然,传递给Find()
的值必须完全是TaxNumber
类型,但是TaxNumber
是抽象类型并且无法实例化,在这种情况下如何使用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)