我有下表
tblChild
FatherCode ChildNumber 名称
FatherCode
和ChildNumber
是表格的主键。
由于这种情况经常在这个数据库中发生(我对它有ZERO控制权),我为我创建了以下类来映射Id:
public class ComposedId {
public virtual int FatherId {get;set;}
public virtual int ChildId {get;set;}
//More code implementing Equals and GetHashCode
}
现在,映射如下:
aMapper.Class<Child>(aClassMapper => aClassMapper.ComposedId(aComposedIdMapper =>
{
aComposedIdMapper.Property(aChild => aChild.Id); //Id's implementation is: public virtual ComposedId Id {get;set;}
}));
aMapper.Class<Child>(aClassMapper => aClassMapper.ComponentAsId(aChild => aChild.Id, aComponentAsIdMapper =>
{
aComponentAsIdMapper.Property(aComposedId => aComposedId.FatherId, aPropertyMapper => aPropertyMapper.Column("FatherCode"));
aComponentAsIdMapper.Property(aComposedId => aComposedId.ChildId, aPropertyMapper => aPropertyMapper.Column("ChildNumber"));
}));
但是当我尝试查询表时,NHibernate会尝试将Id作为列。
我不知道我做错了什么,我尝试了很多方法来映射这个结构,但没有任何作用:(
答案 0 :(得分:2)
映射中的第一行不正确。
我使用了这个,这只是代码的简化版本:
mapper.Class<Child>(cm => cm.ComponentAsId(
x => x.Id,
caim =>
{
caim.Property(x => x.FatherId, pm => pm.Column("FatherCode"));
caim.Property(x => x.ChildId, pm => pm.Column("ChildNumber"));
}));
它正确生成了这种映射(XML序列化):
<composite-id class="ComposedId" name="Id">
<key-property name="FatherId" column="FatherCode" />
<key-property name="ChildId" column="ChildNumber" />
</composite-id>
......这反过来会产生正确的SQL。
你在没有第一行的评论中说,但你可能忘记在测试时编译,部署或重启服务器。
作为旁注,如果您重命名ComposedId
的属性以匹配数据库并使用ConventionModelMapper
,则您甚至不必手动映射Id。
要获取XML映射,我使用它:
var mappingDocument = mapper.CompileMappingForAllExplicitlyAddedEntities();
new XmlSerializer(typeof(HbmMapping)).Serialize(Console.Out, mappingDocument);