C# NHibernate尝试在不存在的列中进行查询
使用fluent NHibernate,我映射了一个具有Id列(UsuarioConta)的实体,该实体引用另一个实体(MoedaValor)作为组件,它没有Id列。但当我试图查询UsuarioConta时,它返回一个错误:C# NHibernate尝试在不存在的列中进行查询,c#,sql-server,nhibernate,fluent-nhibernate,C#,Sql Server,Nhibernate,Fluent Nhibernate,使用fluent NHibernate,我映射了一个具有Id列(UsuarioConta)的实体,该实体引用另一个实体(MoedaValor)作为组件,它没有Id列。但当我试图查询UsuarioConta时,它返回一个错误:无效的列名“Id”。 查看NHibernate查询,我可以看到NHibernate试图在MoedaValor表中的一个不存在的列中进行查询,就好像我引用了一个Id列—我没有引用 我的地图: public class UsuarioContaMap { public U
无效的列名“Id”。
查看NHibernate查询,我可以看到NHibernate试图在MoedaValor表中的一个不存在的列中进行查询,就好像我引用了一个Id列—我没有引用
我的地图:
public class UsuarioContaMap
{
public UsuarioContaMap()
{
Table("UsuarioConta");
Id(x => x.Id).GeneratedBy.Identity()
References<Usuario>(x => x.Usuario)
.Column("IdUsuario")
.ForeignKey("FK_UsuarioConta_Usuario").Nullable();
HasMany<UsuarioContaMovimentacao>(x => x.Movimentacoes)
.KeyColumn("IdUsuarioConta")
.ForeignKeyConstraintName("FK_UsuarioContMov_UsuarioCont")
.Cascade.AllDeleteOrphan();
HasMany<MoedaValor>(x => x.Saldos)
.Table("UsuarioSaldo")
.KeyColumn("IdUsuarioConta")
.ForeignKeyConstraintName("FK_UsuarioSaldo_UsuarioConta")
.Cascade.AllDeleteOrphan()
.Fetch.Join()
.Component(x =>
{
x.References(y => (Moeda)y.Moeda)
.Column("IdMoeda")
.ForeignKey("FK_UsuarioSaldo_Moeda");
x.Map(y => y.Valor);
});
}
}
public类UsuarioContaMap
{
公共USUARIONTAMAP()
{
表(“UsuarioConta”);
Id(x=>x.Id).GeneratedBy.Identity()
参考(x=>x.Usuario)
.栏(“Idusario”)
.ForeignKey(“FK_UsuarioConta_Usuario”).Nullable();
有很多(x=>x.Movimentacoes)
.KeyColumn(“IdUsuarioConta”)
.ForeignKeyConstraintName(“FK_UsuarioContMov_UsuarioCont”)
.Cascade.AllDeleteOrphan();
HasMany(x=>x.Saldos)
.表格(“UsuarioSaldo”)
.KeyColumn(“IdUsuarioConta”)
.ForeignKeyConstraintName(“FK_UsuarioSaldo_UsuarioConta”)
.Cascade.alldelete孤儿()
.Fetch.Join()
.Component(x=>
{
x、 参考文献(y=>(Moeda)y.Moeda)
.栏(“IdMoeda”)
.ForeignKey(“FK_UsuarioSaldo_Moeda”);
x、 Map(y=>y.Valor);
});
}
}
返回错误的查询:
“选择Movementac2\uu.Id作为Colu 0 0 0 0 0 0 0 0 0 0 0,Movementac3.Id作为Colu 1 0 0 0 0,强>saldos4.Id作为Colu 2 2 0 0 0 0 0 0 0 0 0 0.强>将Movementac2 2 2.UuuuU2.Id作为Col2.Id作为Movementac2.Id作为Col2 2 2.UU2.Id作为Colu 2.U2.Uuuuuuu2.Id作为Col2.UU2.U2.U2.Id作为Col2.UU2.U2.U2.U2.U2.U2.U2.Id作为Col2.U2.U2.U2.Id作为Col2.U2.U2.U0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 275_0_,Movientac2.IdMoeda作为IdMoeda 275_0,Movientac2.Idusarioconta作为Idusari6_275_0,Movientac3.Valor作为Valor 275_1,Movientac3.Tipo作为Tipo 275_1,Movientac3.IdMoeda作为数据275_1,Movietac3.IdMoeda作为IdMoeda 275_1,从Usuario Usuario 0将IdUsuarioConta作为IdUsuari6_275_1_从Usuario Usuario 0_内部连接到Usuario上的Pessoa Usuario_1_。IdPessoa=Usuario_1_u.Id,UsuarioConta UsuarioConta UsuarioConta左外联UsuarioConta左外联UsuarioConta左外联UsuarioConta左外联UsuarioConta左外联UsuarioConta左外联UsuarioConta通常是0。Perfil@p0通常是0。Perfil@p1和usuariocon1_uu0.iduuario=usuario0_u0.IdPessoa
我没有复杂的查询试图得到结果,所以我认为问题出在地图上。有错误吗?您没有明确地为Id指定列名。因此,改变这一点:
Id(x => x.Id).GeneratedBy.Identity()
为此:
Id(x => x.Id).GeneratedBy.Identity().Column("ColumnName")
其中“ColumnName”是主键列的名称。因为此查询是在Hibernate之外封装的,所以需要检查通过列各自的ID调用列的函数。查看正在填充的值并从那里向后工作。即使实体MoedaValor没有任何Id变量?此外,我在查询中所做的唯一比较是使用Usuario实体,而不是MoedaValorI可能会稍微偏离该方法,但是如果Hibernate作为RDBMS是值得的,那么它应该有一个表,根据其ID列出每个表的列。这意味着Hibernate在最坏的情况下不是RDBMS(缺少/额外的列将违反引用完整性),或者应用程序代码中可能存在关闭的内容。因此,请从应用程序到问题所在的RDBMS进行验证。可以在表中获取Hibernate识别的列列表(直接查询Hibernate),但请验证您的方法返回的内容。@clifton_h NHibernate不是RDBMS,而是ORM。到表列的所有映射都是在提出问题的人包含的映射文件中完成的。MoedaValor的映射看起来像什么?