У меня есть абстрактный тип 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 .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));