使用 NHibernate 进行类映射
本文关键字:映射 NHibernate 使用 | 更新日期: 2023-09-27 18:32:48
我有一个普通的数据库表(名为DBFoo):
| PropertyA | PropertyB| PropertyC | PropertyD | PropertyE |
属性 A、属性 B 和属性 C 是密钥的一部分。
为此,在我的程序中,我有以下类结构:
public class Foo
{
public virtual SubFoo SubFoo { get; set; }
public virtual string PropertyC { get; set; }
public virtual string PropertyD { get; set; }
public virtual string PropertyE { get; set; }
}
public class SubFoo
{
public virtual string PropertyA { get; set; }
public virtual string PropertyB { get; set; }
}
现在我正在尝试创建映射文件:
...
<class name="Foo" table="DBFoo">
<composite-id>
// here I Need to define the mapping for the SubFoo properties PropertyA and PropertyB
<key-property name="PropertyC" column="PropertyC"/>
</composite-id>
<property name="PropertyD" column="PropertyD"/>
<property name="PropertyE" column="PropertyE"/>
</class>
....
有人知道我如何定义属性 A 和属性 B 的键属性吗?
提前感谢您的帮助
可能是一个坏主意,但您可以尝试生成一个装饰SubFoo
类的FooIdentifier
类,以提供对PropertyA
、PropertyB
和PropertyC
的直接访问。
public class FooIdentifier
{
private SubFoo InnerSubFoo { get; set; }
public FooIdentifier(SubFoo subFoo, string propertyC)
{
this.InnerSubFoo = subFoo
this.PropertyC = propertyC;
}
public virtual string PropertyA
{
get
{
return SubFoo.PropertyA;
}
set
{
SubFoo.PropertyA = value;
}
}
public virtual string PropertyB
{
get
{
return SubFoo.PropertyB;
}
set
{
SubFoo.PropertyB = value;
}
}
public virtual string PropertyC { get; set; }
}
然后,映射文件可能如下所示:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Foo" table="Foo" lazy="true" >
<composite-id name="FooIdentifier" class="FooIdentifier">
<key-property name="PropertyA" column="PropertyA" />
<key-property name="PropertyB" column="PropertyB" />
<key-property name="PropertyC" column="PropertyB" />
</composite-id>
<property name="PropertyD" column="PropertyD" type="String" />
<property name="PropertyE" column="PropertyE" type="String" />
</class>
</hibernate-mapping>
正如 HuorSwords 所提到的,您可以为表定义一个组合键,为此,您必须创建一个包含属性的复合键类并覆盖哈希键和等于方法...
阅读此博客,了解有关如何实施的更多详细信息。
但我强烈建议不要使用组合键,因为通常可能会出现一些问题。此外,建议在每个表中或多或少地有一个代理键,并在需要时使用辅助键/外键。
这也使 nhibernate 映射变得容易得多!