C# 代码组件ASID的NHibernate映射中的列无效

C# 代码组件ASID的NHibernate映射中的列无效,c#,nhibernate,nhibernate-3,C#,Nhibernate,Nhibernate 3,我有下表 孩子 父代码 儿童号码 名字 FatherCode和ChildNumber是表的主键 由于这种情况在该数据库中经常发生(我对它没有任何控制权),因此我创建了以下类来映射Id: public class ComposedId { public virtual int FatherId {get;set;} public virtual int ChildId {get;set;} //More code implementing Equals and GetHashCo

我有下表

孩子

父代码 儿童号码 名字

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"));
    }));
aMapper.Class(aClassMapper=>aClassMapper.ComposedId(aComposedIdMapper=>
{
aComposedIdMapper.Property(aChild=>aChild.Id);//Id的实现是:公共虚拟ComposedId{get;set;}
}));
类(aClassMapper=>aClassMapper.ComponentAsId(aChild=>aChild.Id,aComponentAsIdMapper=>
{
aComponentAsIdMapper.Property(acomponseId=>acomponseId.FatherId,aPropertyMapper=>aPropertyMapper.Column(“父代码”);
aComponentAsIdMapper.Property(acomponseId=>acomponseId.ChildId,aPropertyMapper=>aPropertyMapper.Column(“ChildNumber”);
}));
但是当我尝试查询表时,NHibernate尝试将Id作为列获取


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

映射中的第一行不正确

我使用了这个,它只是您代码的简化版本:

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"));
    }));

你试过评论第一个映射吗?看起来它弄乱了第二个映射语句。顺便说一句,这是什么映射策略?我看过HBM和Fluent,但这一个我不认识。如果是从NHibernate 3.3开始的话,这是一个饶舌的语言,就像他们自己的Fluent。这是一个问题……是一种新事物,所以没有太多的内容互联网看起来太…脏了。我更喜欢流利。没有办法改变吗?我宁愿不要,因为这种方式是NHibernate固有的。我也不觉得它难看(也许是因为业余爱好。课堂上的事情有点尴尬,但这是我的错,不是NHibernate的)。此外,我们不是来争论哪种技术更好,我只是要让它发挥作用:)问题是我想让ComposeId类成为这种情况下的通用结构,我将再次尝试并告诉您结果。顺便问一下,您如何看待NHibernate生成的xml?还有另一件事。。。如果ComposedId是ComposedId(在本例中,它将是一个接受它的两个属性类型的泛型类。这就是我在这里实际拥有的,为了简单起见,我省略了它)请参见XML序列化的添加块。它与通用ComposeId配合使用效果很好;由于CLR语法,XML很难看,但您不必处理它,所以它不是问题。呵呵,哇!它确实起作用了。也许我在尝试之前忘了清理东西。谢谢你,伙计:)谢谢你的XML,事实上它没用。。。我尝试了Repository.GetAll().Count(),它运行得很好,但当我使用Repository.GetAll().ToList()时,它总是抱怨ID不存在:(
<composite-id class="ComposedId" name="Id">
  <key-property name="FatherId" column="FatherCode" />
  <key-property name="ChildId" column="ChildNumber" />
</composite-id>
var mappingDocument = mapper.CompileMappingForAllExplicitlyAddedEntities();
new XmlSerializer(typeof(HbmMapping)).Serialize(Console.Out, mappingDocument);