Отображение клиента NEST Elasticsearch для абстрактного наследования POCO (C#) - PullRequest
0 голосов
/ 03 апреля 2020

Я использую клиент NESTasticsearch Version = 6.0.0.0. Вот мой POCO:

public abstract class Animal
{
    public bool IsWild { get; set; }
}

public class Dog : Animal
{
    public string BarkSound { get; set; }
}

public class Tiger : Animal
{
    public string SavannahPlace { get; set; }
}

public class Zoo
{
    public IEnumerable<Animal> Animals { get; set; }
}

У меня есть индекс эластичного поиска, в котором я хочу хранить объекты Zoos. Поскольку в Zoo есть этот перечислимый абстрактный класс, у меня возникают проблемы с настройкой сопоставления для него.

Вот как я пытался отобразить Zoo, используя отображение Fluent:

.Index("zoos")
        .Mappings(map => map
            .Map<Zoo>(doc => doc
                .AutoMap()
                .Properties(prop => prop
                    .Object<Animal>(obj => obj
                        .Name(n => n.Animals)
                        .AutoMap()
                        .Properties(prop => prop
                            .Keyword(p => p.Name(n => n.IsWild))
                        )
                    )
                    .Object<Dog>(obj => obj
                        .Name(n => n.Animals)
                        .AutoMap()
                        .Properties(prop => prop
                            .Text(p => p.Name(n => n.BarkSound))
                        )
                    )                                                                     
                    .Object<Tiger>(obj => obj
                        .Name(n => n.Animals)
                        .AutoMap()
                        .Properties(prop => prop
                            .Keyword(p => p.Name(n => n.SavannahPlace))
                        )
                    )
                )
            )
        );

Но делая это конфигурирует отображение для Unite.Animals с последним .Object, который является Тигром, поэтому я собираюсь иметь конфигурацию animal только с базовыми реквизитами Animals и ключевым словом SavannahPlace, потеряв в этом примере ключевое слово BarkSound.

IMO Правильнее всего было бы иметь все свойства всех подклассов Animal для перечислимого Animal.

Так что мой текущий обходной путь - иметь другой класс для Animal, AnimalAll. «Класс, обладающий всеми возможными свойствами всех животных, предназначался для индексации, и мне пришлось бы специально сопоставить в нем обычное животное, чтобы настроить отображение. Но это звучит странно для меня, поэтому я прошу вашей помощи ...

Спасибо, ребята, позаботьтесь.

...