2013-07-16 91 views
1

我認爲這很容易找到,但我遇到了麻煩。我有一個類,它繼承了一個名爲EntityBase的類,它具有一個ID字段。基類看起來像這樣。使用NHibernate映射覆蓋列案例

//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>()); 
} 

我知道自動映射正在加載,因爲它們適用於其他類型,我們重寫該方案。希望這是足夠的信息,有人可以指引我朝着正確的方向發展。

回答

3

你的問題與NHibernate映射無關。使用命名查詢和結果轉換器時不涉及映射。

您的問題是AliasToBeanResultTransformer,它試圖在您的類中爲查詢返回的每個別名查找屬性,並且區分大小寫。

您有4個解決方案:

  1. 如果你可以修改存儲過程,將其更改爲返回正確的情況下。例如:select Id as ID

  2. 將中的ID索引重命名爲Id,並將其映射到ID列。

  3. 如果這是一個孤立的情況,請使用EntityBase刪除繼承並添加一個名爲Id的屬性。

  4. 編寫您自己的NHibernate.Transform.IResultTransformer的實現。 看看https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Transform/AliasToBeanResultTransformer.cs

+0

是的,最後我得到了一個人來修改存儲的過程。我懷疑映射在這種情況下沒有做任何事情,但是謝謝你的確認。 – Kenn

+0

這解決了我的問題!在我的情況下,屬性名稱爲ContactCode,但我使用CreateSQLQuery並傳遞了我的屬性的別名而不帶引號。花費引號後,我的問題得到解決。非常感謝你通過這個答案! –