Свободное владение NHibernate без автоматического сопоставления свойства «один ко многим» в базовом классе - PullRequest
2 голосов
/ 31 марта 2011

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

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 ]

0 голосов
/ 04 апреля 2011

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

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

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

0 голосов
/ 01 апреля 2011

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

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

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

...