我觉得这很容易找到,但我遇到了麻烦。我有一个类,它继承自一个名为EntityBase的类,它有一个ID字段。基类看起来像这样。
//Here is the declaration
public abstract class EntityBase<IdType>
//here is the property
private IdType _id;
public virtual IdType ID
{
get
{
return _id;
}
set
{
_id = value;
}
}
这适用于大多数实体,但我们有一个实体,它实际上是从在另一个数据库上运行的存储过程构建的,问题与我们的数据库不同,它返回“Id”而不是“ID”我尝试了几件事覆盖此并设置ID但我不断收到以下错误
NHibernate.PropertyNotFoundException:在类
中找不到属性“Id”的setterpublic class ListingMapping : IAutoMappingOverride<Listing>
{
public void Override(AutoMapping<Listing> mapping)
{
mapping.Map(x => x.ID).Column("Id");
mapping.Id(x => x.ID).Column("Id");
}
}
以下是创建实体的方式。
public Listing GetListingById(Guid ListingId)
{
IQuery query = GetSession().GetNamedQuery("GetListingById")
.SetParameter("ListingId", ListingId)
.SetResultTransformer(Transformers.AliasToBean<Listing>());
return (query.UniqueResult<Listing>());
}
我知道自动映射正在加载,因为它们适用于我们覆盖该方案的其他类型。希望这是足够的信息,有人可以指出我正确的方向。
答案 0 :(得分:4)
您的问题与NHibernate映射无关。使用命名查询和结果转换器时不涉及映射。
您的问题是AliasToBeanResultTransformer
,它试图在您的类中为查询返回的每个别名找到一个属性,这是区分大小写的。
你有4个解决方案:
如果您可以修改存储过程,请更改它以返回正确的大小写。例如:select Id as ID
。
将ID
中的EntityBase
属性重命名为Id
并将其映射到ID
列。
如果这是一个孤立的情况,请使用EntityBase删除继承并添加名为Id
的属性。
编写自己的NHibernate.Transform.IResultTransformer
实现。
请查看https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Transform/AliasToBeanResultTransformer.cs