0

我使用Nhibernate,並且在使用多個派生類(每個類映射不同的表)獲取基類時遇到問題。當我觀看請求,NHibernate的加入在其對性能的巨大沖擊每一個派生表...如何防止Nhibernate獲取派生類?

這是我班的簡化願景:

public class Animal{ 
    public virtual int ID { get; set;} 
    public virtual string Name { get; set;} 
} 

public class Dog : Animal{ 
    //others properties 
} 

public class Cat: Animal{ 
    //others properties 
} 

public class Person{ 
    public virtual int ID { get; set;} 
    public virtual IEnumerable<Animal> Animals { get; set;} 
} 

一個人有名單動物和我只是想要他們的名字。這個例子並不完美,而且更復雜(一個銀行業務程序),但這反映了我的問題。 我知道它可以做不同的等等,但它是一個遺產,所以我沒有選擇...

在此先感謝。

+2

請將您的查詢發佈到您選擇名稱並提及您的繼承映射策略(我假設每個子類有表,但有無歧義?)。另外,你使用的是哪個版本的NHibernate? – cremor

+0

每個子類@cremor表不需要鑑別器列。 – Firo

+0

@cremor我正在使用每個子類的表,但沒有鑑別器列,我正在使用版本3.3 – Eric

回答

0

畢竟特性,我創建了被狗,貓繼承等一類AnimalBase和一類動物沒有任何孩子(都有接口IAnimal)。

由於95%的要求,我只需要動物,我在我的其他對象像Person中引用這個類。

並不完美,但我沒有找到更好的東西......

FIRO感謝您的幫助。

1

IMO NHibernate只會連接包含投影列的表格。定義查詢,但不會返回Person但項目到DTO /匿名類,你需要

+0

這個動物類將被引用在許多其他映射類(它是在主表的應用程序),所以我認爲你的解決方案不適用於我的情況。 – Eric

+0

@Eric如果你需要完整的動物類,那麼爲什麼不應該NHibernate獲取它?它不能將狗作爲普通動物抓取,因爲那會是錯誤的(假設你有檢查類型的代碼或類似的東西)。要麼獲取完整的對象,要麼只獲取名稱字符串,它們之間沒有任何內容。 – cremor

+0

你想達到什麼目的?如果您告訴NH要加載動物,則必須加入其他表格才能知道要創建哪個子類型。如果你只需要從其他實體引用時需要的名字,然後映射不在這個層次結構中的另一種動物,並引用來自所有其他實體 – Firo

相關問題