2010-04-18 1 views
1

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

партии стол

Id PersonId OrganizationId

Person таблица

Id FName LName

Организация таблицы

Id OrgName OrgDescription

+0

Список литературы (х => x.Person, "PersonId") Not.Nullable(). Ссылки (x => x.Organization, "OrganizationId"). Not.Nullable(); Не работает? – jweyrich

ответ

0

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

Чтобы исправить это, вам просто нужно создать ClassMap для Party и отобразить Id как идентификатор и ссылку Person и Organization.

Затем, в объектах Person и Organization вместо создания сопоставления HasManyToMany для Party вы должны создать HasMany для участника партии.

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

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

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

См. Также my post about the same situation.

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

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

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); 
    } 
} 
+0

Спасибо, Джим. Забавно, что я все это время смотрел на Party Party и не понимал, что таблица Party - это таблица ссылок. Идентификатор auto increment Id в этой таблице отбрасывал меня со следа. Дело в том, что данные в таблице Party ограничены там, где вы можете иметь либо PersonId, либо OrganizationId, он пытается сопоставить его как отношение один к одному, поэтому я согласен с вами, кто бы ни разработал его, вероятно, пропустил эту проблему. Я новичок в NHibernate, я буду очень рад, если вы предоставите какой-то код. Очень ценится. Rusty –

+0

@Rusty: В последнее время я был намного занят, чем ожидал. Итак, я взломал этот код, и я надеюсь, что это поможет вам указать в правильном направлении. Я уверен, что есть другие способы сделать это (может быть, использовать соглашение для класса Party?), Но это был самый простой способ для меня, поскольку все мои таблицы ссылок также имеют поля для проверки, поля заметок и другое случайное дерьмо просто чтобы связать две таблицы вместе. –