Nhibernate一对一映射

时间:2011-04-28 14:29:43

标签: nhibernate-mapping

大家好我已经尝试了一段时间寻找这个问题的解决方案。找不到它。 我有两个课程,我将简化。我的问题是我想要一个Player和Clan之间的单向一对一映射。现在我看到了具有外键的示例。但我不明白。这个映射不会在我的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; }
                }
    }

然后我们有Clan的映射:

<?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>

接下来是班级球员:

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 个答案:

答案 0 :(得分:1)

单向一对一关系应映射为“多对一”元素。 “一对一”用于双向一对一。有关详细信息,请参阅此post。 Howerver还有ConfORM映射,文章也很清晰。

您的Clan映射只需要进行一次更改:

<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>

您不需要在映射中编写程序集限定类名。 hibernate-mapping元素的程序集和命名空间属性指定了NH尝试查找特定类的默认命名空间和程序集。