Nhibernate один-к-одному отображению - PullRequest
1 голос
/ 28 апреля 2011

Здравствуйте, ребята, я пытался найти решение этой проблемы в течение некоторого времени. Не могу найти это. У меня есть два класса, которые я упрощу. Моя проблема в том, что я хочу однонаправленное сопоставление один к одному между игроком и кланом. Теперь я видел примеры, в которых есть внешний ключ. Но я этого не понимаю. Это отображение не создает столбец в моей таблице Clans для ClanLeader ... Я что-то упустил? Спасибо всем за помощь.

public class Clan{
         private Int32 id;

                public virtual Int32 Id
                {
                    get { return id; }
                    set { id = value; }
                }

            private string name;

            public virtual string Name
                {
                    get { return name; }
                    set { name = value; }
                }

                private Player clanLeader;

                public virtual Player ClanLeader
                {
                    get { return clanLeader; }
                    set { clanLeader = value; }
                }
    }

Тогда у нас есть отображение для клана:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="NHibernateSQLite"
                   namespace="NHibernateSQLite" >

  <class name="GamingOrganizerDomainModel.Clan, GamingOrganizerDomainModel" table="Clans"  lazy="false">

    <id name="id" access="field" column="Clan_ID" type="Int32">
      <generator class="native"></generator>
    </id>
    <property name="Name"  column="Clan_Name" unique-key="ClanNameConstraint" type="String"/>


    <one-to-one name="ClanLeader" class="GamingOrganizerDomainModel.Player, GamingOrganizerDomainModel" />

  </class>
</hibernate-mapping>

Далее идет класс Player:

public class Player{
private Int32 id;

                public virtual Int32 Id
                {
                    get { return id; }
                    set { id = value; }
                }

            private string nickname;

            public virtual string Nickname
                {
                    get { return name; }
                    set { name = value; }
                }

}

И отображение для игрока:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="NHibernateSQLite"
                   namespace="NHibernateSQLite" >

  <class name="GamingOrganizerDomainModel.Player, GamingOrganizerDomainModel" table="Players"  lazy="false">

    <id name="id" column="Player_ID" access="field" type="Int32">
      <generator class="native" />
    </id>

    <property name="nickname" access="field" column="Nickname"/>
</class>
</hibernate-mapping>

1 Ответ

1 голос
/ 28 апреля 2011

Однонаправленное отношение один-к-одному должно отображаться как элемент «многие-к-одному».«один-к-одному» используется для двунаправленной связи один-к-одному.Смотрите этот пост для более подробной информации.Несмотря на то, что есть соответствия Conform, статья кристально чиста.

Вам нужно сделать только одно изменение в вашем отображении клана:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="GamingOrganizerDomainModel"
                   namespace="GamingOrganizerDomainModel" >

    <class name="Clan" table="Clans"  lazy="false">
        <id name="id" access="field" column="Clan_ID" type="Int32">
            <generator class="native"></generator>
        </id>
        <property name="Name"  column="Clan_Name" unique-key="ClanNameConstraint" type="String"/>

        <many-to-one name="ClanLeader" class="Player" />
    </class>

Вам не нужно указывать в классе полное имя сборки.Атрибуты Assembly и namespace элемента hibernate-mapping указывают пространство имен по умолчанию и сборку, в которых NH пытается найти определенный класс.

...