Как я могу сопоставить личные отношения в Fluent NHibernate. Я попробовал все остальное - PullRequest
1 голос
/ 18 апреля 2010

У меня есть эта структура таблицы, и я хотел бы отобразить ее, используя Fluent Hibernate (подкласс, если это возможно). Я не могу изменить структуру, потому что база данных имеет слишком много записей и может привести к серьезной переработке приложений. Было бы проще, если бы идентификатор Id из таблицы Party был внешним ключом в виде таблицы личных данных и организационной таблицы, но в конкретном сценарии в базе данных в качестве внешнего ключа в таблице party используется ключ person и организационный ключ. Любая помощь будет великолепна.

Вечеринка

Id PersonId OrganizationId

Персональный стол

Id FName LName

Организационный стол

Id OrgName OrgDescription

1 Ответ

0 голосов
/ 18 апреля 2010

Вы не можете сопоставить таблицу связывания с автоматическим сопоставлением, если она содержит какие-либо поля, кроме двух идентификаторов, которые составляют составной идентификатор. В вашем случае в вашей таблице Party есть поле Id, которое нарушает правила автоматического сопоставления, поскольку оно не разработано должным образом (т. Е. Составной идентификатор не должен иметь идентификатора с автоинкрементным увеличением, хотя мы делаем это для индексации там, где я работаю).

Чтобы это исправить, вам просто нужно создать ClassMap для партии и отобразить Id в качестве Id и ссылочного персонажа и организации.

Затем в сущностях "Персона" и "Организация" вместо создания сопоставления HasManyToMany для партии вы создадите сущность HasMany для стороны.

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

Это поставило меня в тупик на три дня, и я выбрал этот маршрут как "хак", но позже прочитал это объяснение в группе Google Fluent NHibernate пару недель назад.

Надеюсь, это поможет, если не смогу собрать для вас код.

См. Также мой пост о такой же ситуации .

редактирование:

Вот как это будет выглядеть на довольно высоком уровне. Помните, что вам придется инициализировать свои коллекции в конструкторах сущностей и создавать методы установки. См. Начало работы

public class Party {
    public virtual int Id { get; set; }
    public virtual Person Person { get; set; }
    public virtual Organization Organization { get; set; }
}
public class PartyMap : ClassMap<Party> {
    public PartyMap() {
        Id(x => x.Id);
        References(x => x.Person);
        References(x => x.Organization);
    }
}
public class Person {
    public virtual int Id { get; set; }
    public virtual string FName { get; set; }
    public virtual string LName { get; set; }
    public virtual ICollection<Party> Parties { get; set; }
}
public class PersonMap : ClassMap<Person> {
    public PersonMap() {
        Id(x => x.Id);
        Map(x => x.FName);
        Map(x => x.LName);
        HasMany(x => x.Parties);
    }
}
public class Organization {
    public virtual int Id { get; set; }
    public virtual string OrgName { get; set; }
    public virtual string OrgDescription { get; set; }
    public virtual ICollection<Party> Parties { get; set; }
}
public class OrganizationMap : ClassMap<Organization> {
    public OrganizationMap() {
        Id(x => x.Id);
        Map(x => x.OrgName);
        Map(x => x.OrgDescription);
        HasMany(x => x.Parties);
    }
}
...