2012-12-31 2 views
1

У меня есть объект, как этотКак сопоставить список, содержащий объекты того же типа, что и родительского типа, с помощью Fluent NHibernate?

public class Person 
{ 
    public virtual int Pkey { get; set; } 
    public virtual string Name { get; set; } 

    public List<Person> Friends{ get; set; } 
} 

и табличной информация как этот

create table Person 
(
    PKey int not null IDENTITY, 
    Name varchar (20), 
    primary key (PKey) 
) 

Чтобы получить список друзей, я поддерживаю другую таблицу, как этот

Create table Friends 
(
    PKey int not null IDENTITY, 
    PersonFKey int not null Foreign key references Person(PKey), 
    FriendFKey int not null Foreign key references Person(PKey) 
) 

сейчас когда я делаю сопоставление, как показано ниже, я получаю некоторую ошибку (из-за проблемы с отображением)

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Id(x => x.Pkey); 
     Map(x => x.Name); 
     HasManyToMany(x => x.Friends).Cascade.All().Table("Friends").ParentKeyColumn("PersonFKey"); 
    } 
} 

Исключение брошено есть

FluentConfigurationException: "An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail." 

С внутренним исключением,

InvalidProxyTypeException: The following types may not be used as proxies: 

FluentNhibernateLearning.Entities.Person: method get_Friends should be 'public/protected virtual' or 'protected internal virtual' 
FluentNhibernateLearning.Entities.Person: method set_Friends should be 'public/protected virtual' or 'protected internal virtual' 

Может кто-нибудь помочь мне, указывая, что мне не хватает?

+0

Любой причиной вы Бесполезная Не пытайтесь сделать это как указано исключение и просто измените на 'public virtual List Друзья {get; задавать; } '? –

ответ

4

Вы не указали, что такое ошибка, и сопоставление не соответствует классам, но я думаю, проблема в том, что вам не хватает объявления ChildKeyColumn. На карте «многие-ко-многим» вы должны объявлять столбцы родительского и дочернего ключей; родительский ключ является первичным ключом из класса, содержащего коллекцию, а дочерний ключ является первичным ключом класса в коллекции.

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

public class IntermediaryMap : ClassMap<Intermediary> 
{ 
    public IntermediaryMap() 
    { 
     Id(x => x.Pkey); 
     Map(x => x.Name); 
     HasManyToMany(x => x.SubBrokers).Table("Intermediary2SubBroker") 
      .ParentKeyColumn("IntermediaryFKey") 
      .ChildKeyColumn("SubBrokerFKey") 
      .AsSet(); 
    } 
} 
0

Я думаю, что вам нужно объявить друг, как виртуального.

Это то, что сообщение Inner Exception говорит вам, когда он говорит:

«метод get_Friends должен быть„общественность/защищенного виртуальной“или" защищенная внутренняя виртуальная»

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