我是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" />
答案 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