使用NHibernate映射时覆盖列大小写

Ken*_*enn 2 c# fluent-nhibernate

我以为这很容易找到,但遇到了麻烦。我有一个类,它从一个名为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这对于大多数实体来说都可以正常工作,但是我们实际上有一个实体是从另一个数据库上运行的存储过程中构建的,而问题与我们的数据库不同,它返回的是“ Id”而不是“ ID”。设置ID,但我不断收到以下错误

NHibernate.PropertyNotFoundException:在类中找不到属性“ Id”的设置器

public class ListingMapping : IAutoMappingOverride<Listing>
{
    public void Override(AutoMapping<Listing> mapping)
    {
        mapping.Map(x => x.ID).Column("Id");
        mapping.Id(x => x.ID).Column("Id");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是创建实体的方式。

public Listing GetListingById(Guid ListingId)
{
    IQuery query = GetSession().GetNamedQuery("GetListingById")
                        .SetParameter("ListingId", ListingId)
                        .SetResultTransformer(Transformers.AliasToBean<Listing>());

     return (query.UniqueResult<Listing>());
}
Run Code Online (Sandbox Code Playgroud)

我知道自动映射正在加载,因为它们可用于其他类型,其中我们覆盖了该方案。希望这是足够的信息,有人可以指出正确的方向。

Red*_*eda 5

您的问题与NHibernate映射无关。使用命名查询和结果转换器时,不涉及映射。

您的问题是AliasToBeanResultTransformer,它试图在类中为查询返回的每个别名找到一个属性,这区分大小写。

您有4个解决方案:

  1. 如果可以修改存储过程,请对其进行更改以返回正确的大小写。例如:select Id as ID

  2. ID属性重命名EntityBaseId并将其映射到该ID列。

  3. 如果是孤立的情况,请使用EntityBase删除继承并添加一个名为的属性Id

  4. 编写自己的实现NHibernate.Transform.IResultTransformer。看看https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Transform/AliasToBeanResultTransformer.cs