如何在nhibernate中建立一对一关系?(当前不返回外来对象)

如何在nhibernate中建立一对一关系?(当前不返回外来对象),nhibernate,foreign-keys,one-to-one,Nhibernate,Foreign Keys,One To One,我有一个用户,其中一些是员工。这是一对一的关系,并非所有用户都是员工 当我得到一个用户时,它似乎没有返回员工信息,只是将其标记为null。我原以为我对nhibernate很了解,但我尝试过在映射文件中使用这么多属性,但都没有成功。关于我在做什么有什么想法或建议吗 用户类别: public class User { public virtual int UserID { get; set; } public virtual string Username {

我有一个用户,其中一些是员工。这是一对一的关系,并非所有用户都是员工

当我得到一个用户时,它似乎没有返回员工信息,只是将其标记为null。我原以为我对nhibernate很了解,但我尝试过在映射文件中使用这么多属性,但都没有成功。关于我在做什么有什么想法或建议吗

用户类别:

public class User
    {
        public virtual int UserID { get; set; }
        public virtual string Username { get; set; }
        public virtual string Title { get; set; }
        public virtual string Forename { get; set; }
        public virtual string Surname { get; set; }

        public virtual Employee Employee { get; set; }
    }
用户映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Portal.Core"
                   namespace="Portal.Core.Data.Database">

  <class name="User" table="[Users]">
    <id name="UserID">
      <generator class="identity" />
    </id>
    <property name="Username" not-null="true" length="50" />
    <property name="Title" length="10" />
    <property name="Forename" length="50" />
    <property name="Surname" length="50" />

    <one-to-one name="Employee" class="Employee" fetch="select" lazy="false" foreign-key="EmployeeID" />


  </class>

</hibernate-mapping>
员工映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Portal.Core"
                   namespace="Portal.Core.Data.Database">

  <class name="Employee" table="[Employees]">
    <id name="EmployeeID">
      <generator class="identity" />
    </id>
    <many-to-one name="User" unique="true" column="UserID" class="User" fetch="select" foreign-key="UserID" ></many-to-one>

    <property name="RoomNumber" length="20" />
    <property name="JobTitle" length="20" />

  </class>

</hibernate-mapping>


我能看到的唯一不同于Ayende示例的是,您指定了一个外键标记。也许可以尝试将映射剥离到Ayende(顺便说一句,这是完全相同的场景),然后尝试逐个添加额外的属性/属性?

我看到的唯一与Ayende示例不同的是,您指定了一个外键标记。也许可以尝试将映射剥离到Ayende(顺便说一句,这是完全相同的场景),然后尝试逐个添加额外的属性/属性?

已经尝试了他的示例。如果我创建一个新用户并向其中添加一个员工记录,它现在就可以正常工作了。当我尝试将两个用户合并在一起(更新要附加到新用户的员工记录)时,它似乎丢失了链接。NHibernate很难调试:/n你这样做是违反了“规则”——当你告诉NHibernate这是一个一对一的关系时——你不允许让关联的一端转移到另一个端点。相反,您应该更新或创建用户的员工记录,该记录将在您的操作后保留。为了澄清-听起来您的案例并非真正的一对一关系,而是一个组件。@Andi:如果您想保留一对一:您只需将值复制到保留用户的员工记录(如果不存在,则复制新的员工记录)。这样,您就不会“破坏”规则,因为原始员工记录要么与已删除的用户记录一起删除,要么继续与该记录关联。关于不能使用组件:组件映射只有在数据位于同一个表中时才能工作是正确的-我不知道您是否可以更新模式?实际上,更重要的是,您不希望它像“真实”的一对一一样工作,因为您让Id移动。因此,您需要自己处理级联—换句话说—这不是nHibernate的问题,而是您正在反对一对一的想法。如果我是你(我不是),我会忘记一对一的概念,改为多对一,然后手动强制执行一次只有一个用户可以指向同一个员工记录。我已经尝试过他的例子。如果我创建一个新用户并向其中添加一个员工记录,它现在就可以正常工作了。当我尝试将两个用户合并在一起(更新要附加到新用户的员工记录)时,它似乎丢失了链接。NHibernate很难调试:/n你这样做是违反了“规则”——当你告诉NHibernate这是一个一对一的关系时——你不允许让关联的一端转移到另一个端点。相反,您应该更新或创建用户的员工记录,该记录将在您的操作后保留。为了澄清-听起来您的案例并非真正的一对一关系,而是一个组件。@Andi:如果您想保留一对一:您只需将值复制到保留用户的员工记录(如果不存在,则复制新的员工记录)。这样,您就不会“破坏”规则,因为原始员工记录要么与已删除的用户记录一起删除,要么继续与该记录关联。关于不能使用组件:组件映射只有在数据位于同一个表中时才能工作是正确的-我不知道您是否可以更新模式?实际上,更重要的是,您不希望它像“真实”的一对一一样工作,因为您让Id移动。因此,您需要自己处理级联—换句话说—这不是nHibernate的问题,而是您正在反对一对一的想法。如果我是你(我不是),我会忘记一对一的概念,改为多对一,然后手动强制执行一次只有一个用户可以指向同一个员工记录。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Portal.Core"
                   namespace="Portal.Core.Data.Database">

  <class name="Employee" table="[Employees]">
    <id name="EmployeeID">
      <generator class="identity" />
    </id>
    <many-to-one name="User" unique="true" column="UserID" class="User" fetch="select" foreign-key="UserID" ></many-to-one>

    <property name="RoomNumber" length="20" />
    <property name="JobTitle" length="20" />

  </class>

</hibernate-mapping>