我有一个普通的数据库表(Named DBFoo):
| PropertyA | PropertyB| PropertyC | PropertyD | PropertyE |
PropertyA,PropertyB和PropertyC是密钥的一部分。
在我的程序中,我有以下类结构:
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>
....
任何人都知道我如何定义PropertyA和PropertyB的关键属性?
提前感谢您的帮助
答案 0 :(得分:0)
可能是一个坏主意,但您可以尝试生成一个FooIdentifier
类来装饰您的SubFoo
课程,以便直接访问PropertyA
,PropertyB
和{{ 1}}。
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; }
}
答案 1 :(得分:0)
正如HuorSwords所提到的,你可以为你的表定义一个复合键,为此,你必须创建一个复合键类,其中包含属性AND覆盖hashkey和equals方法......
请阅读this blog,详细了解如何实施此项目。
但我强烈建议不要使用复合键,因为通常会出现一些问题。此外,建议每个表中或多或少surrogate key,并在需要时使用辅助密钥/外键。
这使得nhibernate映射变得更加容易!