1

假定以下類:功能NHibernate映射保護性能:無法解析屬性:的BookingNumber:乙

public class A 
{ 
    public virtual ind Id { get; set; } 
    public virtual int Number { get; protected set; } 
} 

public class B : A 
{ 
    public virtual string SomeValue { get; set; } 

    public virtual int BookingNumber 
    { 
    get { return Number; } 
    set { Number = value; } 
    } 
} 

public class C : A 
{ 
    public virtual string SomeOtherValue { get; set; } 

    public virtual int AccountNumber 
    { 
    get { return Number; } 
    set { Number = value; } 
    } 
} 

正如你可以看到我要揭露不同的名稱屬性號。

現在我要地圖A,B,C

​​

有了這個映射,我可以保存的東西到數據庫中。

然而,當我查詢B或C:

Session.QueryOver<B>().Where(x => x.BookingNumber).List(); 

我收到錯誤could not resolve property: BookingNumber of: B

我在做什麼錯?

+1

這個設計聽上去很可怕......你爲什麼要那樣做? –

回答

2

有什麼問題?在未映射的屬性上構建查詢。

(在derrived類以不同的名稱包裝基本屬性至少是奇怪), 如果確實需要這種做法,因爲一些上層需要不同勢 名字相同的屬性...然後,嗯,好。但是,NHibernate必須提供 不同的信息集。

認爲您的查詢是自描述性信息,包含足以轉換爲SQL語句。

所以,如果你使用QueryOver<B>.Where(x => x.BookingNumber == 1)...。該信息(解析lambda表達式時):

  1. 用C#對象B工作,
  2. 找到它的屬性BookingNumber
  3. 發現其映射表示:列名稱BookingNumberColumn
  4. 取的值:1
  5. 內置查詢條件WHERE BookingNumberColumn = 1

在這種情況下,步驟3失敗。沒有列映射到BookingNumber ...

解決方案是,至少在數據(NHibernate的)層,基於一個基類A映射

Session 
    .QueryOver<B>() 
    .Where(x => x.Number == 1) // use the A.Number MAPPED property 
    .List<B>(); 

但應用過濾器,根據我的經驗,我們主要是做,是持久性差異的轉換(不同的id列名,不同的代碼列),並將它們映射到C#基類或具有通用簡化結構的接口。

這裏更多:16. QueryOver Queries