NHibernate加入不正确的字段

时间:2011-05-10 07:30:59

标签: .net nhibernate join

我是Nhibernate的新手,我知道我的问题是什么,但不确定如何修复它。

问题:用户通过EmployeeID而不是UserID加入员工。这会导致问题,因为它会带回不正确的细节。

Employee.hbm.xml
<many-to-one name="User" unique="true" column="UserID" />

User.hbm.xml
<one-to-one name="Employee" foreign-key="EmployeeID" class="Employee" lazy="false" />

Employee.cs
public virtual int EmployeeID { get; set; }
public virtual User User { get; set; } - This is UserID within the actual database
public virtual string EmailAddress { get; set; }

User.cs
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; }

以上是其他人编码的内容,我正在尝试修复它。我试过改变

<one-to-one name="Employee" foreign-key="UserID" class="Employee" lazy="false" />
然而,这仍然会导致问题。

我错过了什么吗?在此先感谢您的帮助: - )

克莱尔

更新

我希望通过一对一的方式加入UserID,但它仍然加入了EmployeeID。有没有其他想法?再次感谢: - )

Employee.hbm.xml
<one-to-one name="User" foreign-key="UserID" class="User" lazy="false" />

User.hbm.xml
<one-to-one name="Employee" foreign-key="UserID" class="Employee" lazy="false" />

3 个答案:

答案 0 :(得分:1)

您不应在 one-to-one 映射中指定任何列名称,因为该信息是many-to-one映射的一部分关系的另一面。

为了解决您的问题,您应该从foreign-key实体的one-to-one映射中删除User属性:

<one-to-one name="Employee" class="Employee" lazy="false" />

NHibernate将使用many-to-one实体上定义的Employee映射中的信息来构建SQL语句。

注意如果Employee始终与User相关联(即Employee.User属性永远不会是null),那么您应该在one-to-one映射中通过添加constrained属性来说明这一事实:

<one-to-one name="Employee" class="Employee" constrained="true" lazy="false" />

相关资源:

答案 1 :(得分:0)

根据您的实体,用户和员工之间没有一对一的关系。请参阅此解释:

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

我认为您需要将多对一指定为一对一。

修改
我想我可能误解了你的情景 您可能希望在此处使用property-ref。所以你的映射看起来像这样:

<one-to-one name="Employee" class="Employee" property-ref="User" lazy="false" />

请查看以下链接了解更多详情:Nhibernate Documentation

此处还有类似帖子:one-to-one and specifying column

答案 2 :(得分:0)

我会在这里使用多对一关系,因为我知道您可能想要合并用户帐户,并且一对一可能会导致将员工记录移至合并用户时出现问题。

如果您将其视为您的用户可以拥有多个员工记录,那么这可以避免此问题。

您是否尝试过以下内容:

Employee.hbm.xml

User.hbm.xml

http://ayende.com/blog/3938/nhibernate-mapping-many-to-one