Свободный 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.