我有一个抽象的 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: '在调用' DbSet .Find的第0位的键值是'CPF'类型,与属性类型' TaxNumber'不匹配。
很明显,传递给'DbSet .Find'的值是'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)
UPDATE:
或者声明这些值为基础类型。
TaxNumber key = CPF;
DbContext.Persons.Find(key);
UPDATE 2:
尝试使用一个基元类型作为键来代替。
EF Core支持使用任何基元类型的属性作为主键,包括
string
,Guid
,byte[]
及其他
参考资料。钥匙类型和价值