如何将DbSet.Find()与以抽象类作为键的实体一起使用?

问题描述 投票:0回答:1

我有一个抽象的TaxNumber类型,它由两种类型实现:CPFCNPJ

[TaxNumber用作Person基本模型中的主键,它也是一种抽象类型,并且由以下两种类型实现:PhysicalPersonLegalPerson

知道:

[当PersonPhysicalPerson时,TaxNumberCPF

[当PersonLegalPerson时,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));
c# entity-framework-core ef-code-first asp.net-core-3.1
1个回答
0
投票

尝试将值转换为基本类型:

DbContext.Persons.Find((TaxNumber)CPF)
DbContext.Persons.Find((TaxNumber)CNPJ)
© www.soinside.com 2019 - 2024. All rights reserved.