2009-11-12 2 views
2

Я использую Fluent NHibernate с таблицей для сопоставления наследования подкласса. Я хочу ссылаться на список конкретных объектов, но я не могу понять, как вывести результат на объекты одного определенного класса. Проблема с отображением наследования NHibernate Fluent

class PetMap : ClassMap<Pet> 
{ 
    public PetMap() 
    { 
     Id(c => c.ID).GeneratedBy.Identity();    
    } 
} 

class DogMap : ClassMap<Dog> 
{ 
    public DogMap() 
    { 
     Mac(c => c.DogSpecificProperty);         
    } 
} 

class CatMap : SubclassMap<Cat> 
{ 
    public CatMap() 
    { 
     Mac(c => c.CatSpecificProperty);          
    } 
} 

class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Id(c => c.ID).GeneratedBy.Identity(); 

     //this works fine 
     HasMany(c => c.Pets); 

     //this dosen't work, because the result contains dogs and cats 
     //how can I tell NHibernate to only fetch dogs or cats? 
     HasMany<Pet>(c => c.Cats); 
     HasMany<Pet>(c => c.Dogs); 
    } 
} 

class Pet 
{ 
    int ID; 
} 
class Dog : Pet 
{ 
    object DogSpecificProperty; 
} 
class Cat : Pet 
{ 
    object CatSpecificProperty; 
} 
class Person 
{ 
    int ID; 
    IList<Pet> Pets; 
    IList<Dog> Dogs; 
    IList<Cat> Cats; 
} 

Может ли кто-нибудь мне помочь? Пожалуйста, извините мой бедный английский.

ответ

1

Я не специалист в Fluent NH, но мне кажется, что ваша личность карта должна выглядеть следующим образом:

class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Id(c => c.ID).GeneratedBy.Identity(); 

     //this works fine 
     HasMany(c => c.Pets); 

     //this dosen't work, because the result contains dogs and cats 
     //how can I tell NHibernate to only fetch dogs or cats? 
     HasMany<Cat>(c => c.Cats); 
     HasMany<Dog>(c => c.Dogs); 
    } 
} 

Потому что ты Человек имеет свойство Dogs, который является IList не IList , и наоборот то же самое для кошек.

+0

HasMany(c => c.Cats) Это выглядит немного глупо, но я думаю, что это правильно, потому что таблица Pet имеет ссылку на таблицу Person. Я получаю это решение из другого вопроса переполнения стека. Мне кажется, что HasMany (c => c.Cat) делает то же самое, что HasMany (c => c.Cat) .KeyColumn ("PetID"). В обоих случаях я получаю результат от кошек и собак. – trichterwolke

+0

@trichterwolke, если вы говорите, что классы Cat и Dog на самом деле происходят из таблицы Pet в вашей БД, тогда я бы подумал, что вы скажете это в CatMap и DogMap, а не в PersonMap. Я считаю, что именно так я и делал это в прошлом при использовании FNH. – Joseph

Смежные вопросы