Как использовать DbSet.Find () с сущностью, у которой в качестве ключа используется абстрактный класс? - PullRequest
0 голосов
/ 30 апреля 2020

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

1 Ответ

0 голосов
/ 30 апреля 2020

Попробуйте привести значения в качестве базового типа:

DbContext.Persons.Find((TaxNumber)CPF)
DbContext.Persons.Find((TaxNumber)CNPJ)

ОБНОВЛЕНИЕ:

Или попробуйте объявить значения в качестве базового типа:

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

ОБНОВЛЕНИЕ 2:

Попробуйте вместо этого использовать тип примитива.

EF Core поддерживает использование свойств любого типа примитива в качестве основного. ключ, включая string, Guid, byte[] и другие

Ссылка: Типы ключей и значения

...