2

我有下表

tblChild

父代号子号名称

FatherCode并且ChildNumber是表的主键。

由于在这个数据库中经常发生这样的事情(我对它有零控制),我为我创建了以下类来映射 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 作为列获取。

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

4

1 回答 1

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以匹配 db 并使用ConventionModelMapper,您甚至不必手动映射 Id。


为了获得 XML 映射,我使用了这个:

var mappingDocument = mapper.CompileMappingForAllExplicitlyAddedEntities();
new XmlSerializer(typeof(HbmMapping)).Serialize(Console.Out, mappingDocument);
于 2012-07-07T01:41:57.467 回答