【发布时间】:2010-12-31 13:20:08
【问题描述】:
我在 NHibernate 中映射以下内容时遇到问题:
我有两张表(这些是旧表,无法更改):
tbl零件 ======= + --- ID int identity(1,1) [----------+ |名称 varchar(50) | | PartTypeID 整数 | 1:* 数量 int | | | | tblPartAssemblyItems *:1 | =====================| +-] PartID int (PK) | AssemblyItemPartID int (PK) ---------------+ 状态整数 编码 varchar(50)tblParts.PartTypeID 告诉我们零件的类型。有几个可能的值。有一种特殊情况:
-
PartTypeID= 0 - 它告诉我们这部分由tblPartAssemblyItems中列出的 0 个或多个子部分组成。 -
PartTypeID= 1 - 这是一个完整的独立部分 -
PartTypeID= 2 - 这部分是用来补其他部分的
PartID 是一个外键值tblParts.ID。
AssemblyItemPartID 引用 tblParts 中的零件记录 tblParts.ID。
一个子部分永远不会由其他子部分组成,这会使嵌套保持在一层深度。
PartID + AssemblyItemPartID 构成复合主键。
在我的代码中:
public class Part
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual int PartTypeID { get; set; }
public virtual int Quantity { get; set; }
public virtual IList<PartAssemblyItem>
}
public class PartAssemblyItem
{
public virtual int PartID { get; set; }
public virtual int AssemblyItemPartID { get; set; }
public virtual int Status { get; set; }
public virtual string Coding { get; set; }
public virtual string Name { get; set; }
public override bool Equals(object obj) { .. snipped .. }
public override int GetHashCode() { .. snipped .. }
}
我的基本映射工作正常:
<class name="Part" table="tblParts">
<id name="ID">
<column name="ID" sql-type="int" not-null="true"/>
<generator class="identity" />
</id>
<property name="Name"/>
<property name="PartTypeID"/>
<bag name="PartAssemblyItems">
<key column="PartID"/>
<one-to-many class="PartAssemblyItem"/>
</bag>
</class>
<class name="PartAssemblyItem" table="tblPartAssemblyItems">
<composite-id>
<key-property name="PartID" column="PartID"/>
<key-property name="AssemblyItemPartID" column="AssemblyItemPartID"/>
</composite-id>
<property name="Status" />
<property name="Coding" />
<property name="Name" /> <-- How do I map this?
</class>
但是我不知道如何加入/回顾tblParts 以获取PartAssemblyItem 的Name。
如果这是 T-SQL,我会做这样的事情来选择所有部分及其组成部分:
SELECT p.ID, p.Name, p.PartTypeID, i.AssemblyItemPartID,
i.Status, i.Coding,
p2.Name AS AssemblyItemPartName
FROM tblParts p
LEFT JOIN tblPartAssemblyItems i ON p.ID = i.PartID
-- This join here to get the subassembly name
LEFT JOIN tblParts p2 ON i.AssemblyItemPartID = p2.ID
WHERE p.PartTypeID <> 2
ORDER BY p.ID
如何以“NHibernate”方式执行此操作,我可以使用 HQL 重新加入 Part/tblParts 吗?
【问题讨论】:
标签: c# .net nhibernate c#-4.0 nhibernate-mapping