Свободный NHibernate не автоматически отображает свойство "один ко многим" в базовом классе

Допустим, у меня есть абстрактный базовый класс, определенный следующим образом:

public abstract class CompanyBase : EntityBase<CompanyBase>
{
    public virtual string Name { get; set; }
    public virtual StreetAddress Address { get; set; }
    public virtual IEnumerable<PhoneNumber> PhoneNumbers { get; set; }
}

Затем я создаю несколько других классов, производных от этого класса, например:

public class CustomerCompany : CompanyBase
{
    // Properties relevant to a customer
}

public class VendorCompany : CompanyBase
{
    // Properties relevant to a vendor
}

Каждый производный класс имеет свою собственную таблицу - в этом примере CustomerCompany и VendorCompany. Там нет таблицы CompanyBase.

Я установил автоматическое отображение через Fluent NHibernate, игнорируя базовые классы, и все отлично работает, кроме PhoneNumbers имущество. Он не отображается в файле hbm при экспорте и не извлекается из базы данных. Кажется, что это просто с видом на эту собственность. Если я поставлю PhoneNumbers Свойство на производном классе, все отлично работает.

Я не смог найти ничего в интернете, связанного с этим... кто-нибудь видел это? Есть ли способ обойти это или мне нужно переместить PhoneNumbers объявление в производные классы (и в результате много дублирования)?

Обновить:
Я принял ответ переопределения ниже, но все же продолжаю утверждать, что автоматическое сопоставление должно учитывать коллекции без переопределений. То, что я в итоге сделал, чтобы решить эту конкретную проблему, - это перейти к единой дискриминированной таблице, а не к таблице на подкласс. Это позволило правильно автоматизировать процесс.

2 ответа

Решение

Вы всегда можете отменить соглашение. Автоматическое сопоставление очень специфично и может определять только то, что оно уже знает, и что вы дополнительно говорите:

mappings
   .Override<CustomerCompany>(m=>m.HasMany(x=>x.PhoneNumbers))
   .Override<VendorCompany>(m=>m.HasMany(x=>x.PhoneNumbers));

Добавление этого в ваш конфигурацию автоматического отображения должно привести к тому, что оно будет следовать как можно большему количеству соглашений, но также и выполнено в соответствии с указаниями.

Одна вещь, которую вы могли бы попробовать...

Измените тип PhoneNumbers с IEnumerable на IList. Затем я ожидал бы, что все ваши производные классы наследуют список, без необходимости в соглашениях или переопределениях.

По своему опыту я знаю, что IList хорошо поддерживается FNH Automapping - не очень уверен в IEnumerable.

Другие вопросы по тегам