2012-09-13 49 views
4

我使用NH 3.3.1。 假設簡單的類:NHibernate 3.3.1顯式多態性

public class TestBase 
{ 
    public virtual int Id { get; set; } 

    public virtual string A { get; set; } 
} 

public class Test : TestBase 
{ 
    public virtual string B { get; set; } 
} 

和映射他們:

public sealed class TestBaseMap : ClassMap<TestBase> 
{ 
    public TestBaseMap() 
    { 
     this.Polymorphism.Explicit(); 
     this.Id(a => a.Id).GeneratedBy.Identity(); 
     this.Map(a => a.A); 
    } 
} 

public sealed class TestMap :SubclassMap<Test> 
{ 
    public TestMap() 
    { 
     this.Map(a => a.B); 
    } 
} 

即使Polymorphism.Explicit()規定,NH仍留有查詢TestBase時加入測試。

var a = this.Session.Get<TestBase>(1); 

我真的不需要這個加入'cuz會有很多的子類。 我檢查了流利生成的xml。沒關係,「顯式」條款在那裏。我究竟做錯了什麼?

回答

2

我想顯式多態只能用於查詢,不能用於session.Get。但我找不到任何參考。


試試看能不能查詢的基類,但始終有一個具體的子類(在大多數情況下,更好的設計反正):

public abstract class TestBase 
{ 
    public virtual int Id { get; set; } 

    public virtual string A { get; set; } 
} 

public class TestA : TestBase 
{ 
    public virtual string B { get; set; } 
} 

public class TestB : TestBase 
{ 
    public virtual string B { get; set; } 
} 

var a = this.Session.Get<TestA>(1); 
+0

我試過這兩個查詢,並得到。沒有運氣。我會嘗試使用以前的NH版本。人們寫這個功能前段時間效果很好。 – Vitaly

+0

沒有所有NH 3版本的運氣... – Vitaly

+0

它也可能是您查詢基類的問題。您應該嘗試繼承所有具體實例。我在回答中添加了另一節。 –

2

確定。我懂了。正如Stefan所設想的那樣,我抽象了TestBase。但是因爲我確實需要查詢TestBase表而沒有多餘的連接,所以我引入了stub類:

public class TestStub : TestBase 
{ 
    // nothing 
} 

這個類是絕對空的。地圖:

public sealed class TestStubMap : SubclassMap<TestStub> 
{ 
    public TestStubMap() 
    { 
     this.Table("TestBase"); 
     this.KeyColumn("Id"); 
    } 
} 

現在我可以查詢:

var a = this.Session.Get<TestStub>(1) 

它產生只有一個連接(TestBase加入TestBase)。所以現在我可以從數據庫中獲取我的TestBase,而無需開銷。我不喜歡黑客,但如果內置邏輯不起作用(多態性=顯式),還有什麼可做。