gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:58 25 4
gpt4 key购买 nike

我有下表

child

父亲守则 child 号码 姓名

FatherCodeChildNumber 是表的主键。

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

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

最佳答案

映射中的第一行不正确。

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

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

关于c# - NHibernate Map-by-Code ComponentAsId 中的无效列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11362816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com