Свободный NHibernate Много-ко-многим
Я использую Fluent NHibernate и имею некоторые проблемы, связанные с настройкой многих или многих отношений с одним из моих классов. Это, наверное, глупая ошибка, но я застрял, пытаясь заставить ее работать. В любом случае, у меня есть пара классов, у которых есть отношения Many-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 и В нем сохранен личный идентификатор.
Спасибо за любые советы, которые у вас могут быть.
Ответы
Ответ 1
Тот факт, что он добавляет две записи в таблицу, выглядит так: вам не нужен обратный атрибут. Поскольку и человек, и группа изменяются, NHibernate сохраняет связь дважды (один раз для каждого объекта). Обратный атрибут предназначен специально для того, чтобы избежать этого.
Я не уверен, как добавить его в сопоставление в коде, но ссылка показывает, как это сделать в XML.
Ответ 2
@Сантьяго Я думаю, что ты прав.
Ответ может заключаться в том, что вам нужно удалить одну из ваших объявлений ManyToMany, больше глядя на Fluent, похоже, что это может быть достаточно умным, чтобы просто сделать это за вас.
Ответ 3
Вы уверены, что добавили Person в Groups.Admin? Вы должны сделать обе ссылки.
Ответ 4
У вас есть три таблицы правильно?
Люди, группы и администраторы групп
когда вы добавляете в обе стороны, вы получаете
Люди (с идентификатором p1)
Группы (с идентификатором g1)
а в GroupAdministrators у вас есть два столбца и таблица с
(p1, g1)
(p1, g1)
и ваш код unit test выглядит следующим образом.
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();
И затем в вашем тесте вы создаете новый контекст и проверяете, что в контексте, и вы вернетесь правильно, но ваши таблицы все испорчены?