Подтвердить что ты не робот

Свободный 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 и В нем сохранен личный идентификатор.

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

4b9b3361

Ответ 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();

И затем в вашем тесте вы создаете новый контекст и проверяете, что в контексте, и вы вернетесь правильно, но ваши таблицы все испорчены?