0
这可能很简单,但我认为我错过了一些东西。我有一个自我联接表Units
,每个单元都有一个主单元:NHibernate映射自联表?
这样我就可以查询的是这样的:
表units
映射到以下课程:
public class Units
{
public virtual int Unit_Id { get; private set; }
public virtual string Unit { get; set; }
public virtual decimal Unit_Value { get; set; }
public virtual Units Main_Unit { get; set; }
}
以.hbm映射文件为f ollows:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NewA.Domain" namespace="NewA.Domain">
<class name="NewA.Domain.Entities.Units,NewA.Domain" table="Units">
<id name="Unit_Id" column="Unit_Id" type="Int32" length="4" unsaved-value="0">
<generator class="native">
</generator>
</id>
<property name="Unit" column="Unit" type="string" length="50" not-null="true"/>
<one-to-one name="Main_Unit" class="NewA.Domain.Entities.Units,NewA.Domain"/>
</class>
</hibernate-mapping>
当用下面的代码测试这些实体:
Units unit = _UnitsRepository.GetById(2);
string parent_unitname = unit.Main_Unit.Unit;
Assert.AreEqual("pack",parent_unitname);
我得到了以下错误时抛出:
Expected values to be equal. Expected Value : "pack" Actual Value : "kg"
的问题是的Main_Unit
财产Unit
实体引用了它自己,所以我错过了什么我怎样才能写出像递归SQL CTE这样的东西来应用等级等,因为我有与其他更复杂的自连接表和更复杂的查询相同的问题。
为什么需要多到一个一个一对一的映射??何地映射insteed是在您的配置关系的另一部分,一对多部分?? Main_Unit仅引用了一个单位的引用,正如我所提到的那样,只有一个表单位。那你的配置中的Main_Unit_id是什么,没有Main_Unit表,它只是Units表。 –
**一对一**意味着您将无法在** kg **中表示** g **和** mg **(即类似1000克==千克,1,000,000 = = 1公斤)。在你的情况下,许多不同的“小数”单位可能表示在同一个Main_Unit中,所以你需要**多对一**。 ** Main_Unit_id **引用对象** Units **(映射到表** Units **),在您的示例中,这对应于列** Main_Unit **。流利的NHibernate只是为外键列添加了** _id **这个命名约定。您可以像使用Id生成器一样重写此约定 –