如何解决NHibernate映射自联接表?
| 这可能很简单,但我想我缺少了一些东西。我有一个自连接表Units
,每个单元都有一个主单元:
这样我可以查询如下内容:
表“ 1”映射到以下类:
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映射文件如下:
<?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\"
问题是Unit
实体的Main_Unit
属性正在引用自身,因此我在这里缺少什么??以及如何编写类似递归SQL CTE的方法来应用等级等,因为与其他对象有相同的问题具有更复杂查询的复杂自连接表。
解决方法
您需要多对一映射,而不是一对一映射。
试试这个配置:
<hibernate-mapping xmlns=\"urn:nhibernate-mapping-2.2\">
<class xmlns=\"urn:nhibernate-mapping-2.2\" name=\"NewA.Domain.Entities.Units.Units,NewA.Domain,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null\" table=\"`Units`\">
<id name=\"Unit_Id\" type=\"System.Int32,mscorlib,Version=4.0.0.0,PublicKeyToken=b77a5c561934e089\">
<column name=\"Unit_Id\" />
<generator class=\"native\" />
</id>
<property name=\"Unit\" type=\"System.String,PublicKeyToken=b77a5c561934e089\">
<column name=\"Unit\" />
</property>
<property name=\"Unit_Value\" type=\"System.Decimal,PublicKeyToken=b77a5c561934e089\">
<column name=\"Unit_Value\" />
</property>
<many-to-one class=\"NewA.Domain.Entities.Units.Units,PublicKeyToken=null\" name=\"Main_Unit\">
<column name=\"Main_Unit_id\" />
</many-to-one>
</class>
</hibernate-mapping>
我建议您尝试Fluent NHibernate-它可以为您动态生成映射。
这是我使用的配置:
var fluent = Fluently.Configure()
.Mappings(c => c.AutoMappings.Add(AutoMap.AssemblyOf<Units>()
.Override<Units>(u => u.Id(uu => uu.Unit_Id).GeneratedBy.Native())))
.Database(() => SQLiteConfiguration.Standard.UsingFile(\"test.sqlite3\"));
var configuration = fluent.BuildConfiguration();
// Generate database schema
new SchemaExport(configuration).Create(false,true);
var sessionFactory = configuration.BuildSessionFactory();
// Now just open session and do whatever you need
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。