Таблица соединений «многие ко многим» NHibernate Map - PullRequest
3 голосов
/ 19 мая 2009

Моя структура базы данных выглядит примерно так:

Person
  Id
  Name
  FieldA
  FieldB

Phone
  Id
  Number

PersonPhone
  PhoneId
  PersonId
  IsDefault

Мое сопоставление NHibernate для объектов Person и Phone прямолинейно, с PersonPhone у меня возникли сложности. Я хочу иметь коллекцию объектов PersonPhone в качестве свойства Person, которое позволит мне иметь номер телефона человека и иметь возможность определить, какой номер телефона является «по умолчанию» или основным номером человека.

в идеале мне бы хотелось, чтобы мой объект PersonPhone выглядел так:

public class PersonPhone
{
    public virtual Person Person { get; set; }
    public virtual Phone Phone { get; set; }
    public virtual bool IsDefault { get; set; }
}

пока что мое отображение NHibernate для этой таблицы выглядит следующим образом:

<class name="PersonPhone" table="PersonPhone">
    <composite-id>
        <key-property name="Person" column="PersonId" />
        <key-property name="Phone" column="PhoneId" />
    </composite-id>
    <property name="IsDefault" column="IsDefault"/>
</class>

но когда NHibernate компилирует мои отображения, я получаю сообщение об ошибке:

Не удалось скомпилировать документ сопоставления: MyApp.Entities.PersonPhone.hbm.xml. NHibernate.MappingException: не удалось определить тип для: MyApp.Entities.Person, MyApp.Entities, версии = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null, для столбцов: NHibernate.Mapping.Column (PersonId)

Любые идеи о том, как это должно быть сопоставлено?

Ответы [ 3 ]

6 голосов
/ 19 мая 2009

Ответ заключается в использовании элемента в вашем составном ключе, а не свойства ключа

<class name="PersonPhone" table="PersonPhone">
    <composite-id>
        <key-many-to-one name="Person" column="PersonId"></key-many-to-one>
        <key-many-to-one name="Phone" column="PhoneId"></key-many-to-one>
    </composite-id>
    <property name="IsDefault" column="IsDefault"/>
</class>
3 голосов
/ 10 марта 2011

Чтобы настроить такое же сопоставление с Fluent NHibernate, сделайте следующее:

public class PersonPhoneMap : ClassMap<PersonPhone>
{
    public PersonPhoneMap()
    {
        CompositeId()
            .KeyReference(p => m.Person)
            .KeyReference(p => m.Phone);

        References(p => p.Person)
            .Column("PersonID");
        References(m => m.Phone)
            .Column("PhoneID");
        Map(p => p.IsDefault)
            .Column("IsDefault");
    }
}
3 голосов
/ 17 июня 2009

Я думаю, что более уместно рассмотреть отношения «многие ко многим» между сущностями «Телефон» и «Перон» и избавиться от сущности «Персона».

...