2008-09-20 5 views
22

Я использую Fluent NHibernate и имею некоторые проблемы, связанные с множеством отношений с одним из моих классов. Это, наверное, глупая ошибка, но я застрял, пытаясь заставить ее работать. В любом случае, у меня есть пара классов, у которых есть отношения Many-Many.Fluent NHibernate Many-to-Many

public class Person 
{ 
    public Person() 
    { 
     GroupsOwned = new List<Groups>(); 
    } 

    public virtual IList<Groups> GroupsOwned { get; set; } 
} 

public class Groups 
{ 
    public Groups() 
    { 
     Admins= new List<Person>(); 
    } 

    public virtual IList<Person> Admins{ get; set; } 
} 

С отображение глядя, как этот

лицо: ...

HasManyToMany<Groups>(x => x.GroupsOwned) 
    .WithTableName("GroupAdministrators") 
    .WithParentKeyColumn("PersonID") 
    .WithChildKeyColumn("GroupID") 
    .Cascade.SaveUpdate(); 

Группы: ...

HasManyToMany<Person>(x => x.Admins) 
    .WithTableName("GroupAdministrators") 
    .WithParentKeyColumn("GroupID") 
    .WithChildKeyColumn("PersonID") 
    .Cascade.SaveUpdate(); 

Когда я запускаю мой тест интеграции, в основном я создавая нового человека и группу. Добавление группы в Person.GroupsOwned. Если я возвращу объект Person обратно из репозитория, GroupOwned будет равен исходной группе, однако, когда я получу группу обратно, если я проведу кол-во на Group.Admins, счет будет равен 0. Таблица Join имеет идентификатор GroupID и В нем сохранен личный идентификатор.

Спасибо за любой совет, который у вас может быть.

ответ

39

Тот факт, что он добавляет две записи в таблицу, выглядит так, будто вам не хватает inverse attribute. Поскольку и человек, и группа изменяются, NHibernate сохраняет связь дважды (один раз для каждого объекта). Обратный атрибут предназначен специально для того, чтобы избежать этого.

Я не уверен, как добавить его в сопоставление в коде, но ссылка показывает, как это сделать в XML.

+0

То, что мертво. Спасибо – 2008-09-20 19:21:41

+3

Не следует ли это помечать как правильный ответ? – Avish 2011-07-03 08:00:33

0

Обязательно ли вы добавляете Person в группы .Admin? Вы должны сделать обе ссылки.

0

У вас есть три стола справа?

Людей, Группы, и GroupAdministrators

при добавлении к обеим сторонам, вы получаете

Людей (с идентификатором p1) группы (с идентификатором g1)

и в GroupAdministrators у вас есть два столбца и таблицы, которая имеет

(p1, g1)

(p1, g1)

и ваш тестовый код устройства выглядит следующим образом.

Context hibContext //Built here 
Transaction hibTrans //build and start the transaction. 

Person p1 = new Person() 
Groups g1 = new Groups() 

p1.getGroupsOwned().add(g1) 
g1.getAdmins().add(p1) 

hibTrans.commit(); 
hibContext.close(); 

А потом в тесте вы делаете новый контекст, и тест, чтобы увидеть, что в контексте, и вы получите обратно правильно, но ваши таблицы все сброшенные вверх?

7

@ Сантьяго Я думаю, что вы правы.

Ответ может заключаться в том, что вам нужно удалить одну из ваших объявлений ManyToMany, больше глядя на Fluent, похоже, что она может быть достаточно умна, чтобы просто сделать это за вас.

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