NHibernate Map-by-Code ComponentAsId中的列无效

时间:2012-07-06 13:08:10

标签: c# nhibernate nhibernate-3

我有下表

tblChild

FatherCode    ChildNumber    名称

FatherCodeChildNumber是表格的主键。

由于这种情况经常在这个数据库中发生(我对它有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作为列。

我不知道我做错了什么,我尝试了很多方法来映射这个结构,但没有任何作用:(

1 个答案:

答案 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);