【问题标题】:Overriding column case when mapping with NHibernate使用 NHibernate 映射时覆盖列大小写
【发布时间】:2013-07-17 00:26:30
【问题描述】:

我认为这很容易找到,但我遇到了麻烦。我有一个类继承自一个名为 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”的设置器

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

以下是实体的创建方式。

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

     return (query.UniqueResult<Listing>());
}

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

【问题讨论】:

    标签: c# fluent-nhibernate


    【解决方案1】:

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

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

    您有 4 个解决方案:

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

    2. EntityBase 中的ID 属性重命名为Id,并将其映射到ID 列。

    3. 如果这是一种孤立的情况,请放弃使用 EntityBase 的继承,并添加一个名为 Id 的属性。

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

    【讨论】:

    • 是的,最后我找人修改了存储过程。我怀疑在这种情况下映射没有任何作用,但感谢您确认。
    • 这解决了我的问题!!在我的情况下,属性名称为 ContactCode,但我使用 CreateSQLQuery 并传递了我的属性的别名,不带引号。用引号后我的问题解决了。非常感谢您的回答!!!
    猜你喜欢
    • 2015-04-26
    • 2012-04-14
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    相关资源
    最近更新 更多