如何使用DbSet.Find()来处理一个以抽象类为键的实体?

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

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

TaxNumber 中作为主键使用。Person 基础模型,它也是一个抽象类型,由两个类型实现。PhysicalPersonLegalPerson.

知道这一点。

当... PersonPhysicalPerson, TaxNumberCPF.

PersonLegalPerson, TaxNumberCNPJ.

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

System.ArgumentException: '在调用' DbSet .Find的第0位的键值是'CPF'类型,与属性类型' TaxNumber'不匹配。

很明显,传递给'DbSet .Find'的值是'CPF'类型的,与属性类型'TaxNumber'不匹配。Find() 必定是那种 TaxNumberTaxNumber 是一个抽象类型,不能被实例化,如何使用 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)

UPDATE:

或者声明这些值为基础类型。

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

UPDATE 2:

尝试使用一个基元类型作为键来代替。

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

参考资料。钥匙类型和价值

© www.soinside.com 2019 - 2024. All rights reserved.