2012-02-16 48 views
0

我有幾個類/映射...它的所有工作正常... 有時創造更好的性能視圖...映射一個自定義的NHibernate類(如視圖)

我倒是喜歡知道it's更多鈔票無需創建數據庫視圖中創建一個特殊的映射......

例如,我有:

class Test 
{ 
    Test2 test2; 
    string a; 
} 

class Test2 
{ 
    Test3 test3; 
    string x; 
} 

class Test3 
{ 
    Test4 test4; 
    string y; 
} 

我倒是想創建一個類/映射(而無需創建一個數據庫查看)像這樣:

class CustomTest 
{ 
    string test_a; 
    string Test2_x; 
    string Test2_y; 
} 

它是否可行?

+0

「CustomTest」是隻讀類嗎?或者你想發送更新到三個表? – Rippo 2012-02-17 05:20:30

+0

不,更新到三個表... – Paul 2012-02-23 10:56:31

+0

我不認爲這是可能的單獨映射,你將需要手動你自己的'更新',而不是依靠會話被骯髒。 – Rippo 2012-02-23 14:00:32

回答

1

您可以爲一個關聯創建類/映射,但不能嵌套。你可以在映射中使用自定義的sql,但我認爲以下更容易。

Test2 test2alias= null; 
Test3 test3alias = null; 
CustomTest view = null; 

var results = session.QueryOver<Test>() 
    .JoinAlias(t => t.Test2,() => test2alias) 
    .JoinAlias(() => test2alias.Test3,() => test3alias) 
    .SelectList(x => 
    { 
     x.Select(t => t.a).WithAlias(() => view.a) 
     x.Select(() => test2alias.x).WithAlias(() => view.x) 
     x.Select(() => test3alias.y).WithAlias(() => view.y) 
    }) 
    .TransformUsing(Transformers.AliasToBean<CustomTest>()) 
    .List<CustomTest>() 

注:這是一個只讀訪問

第二次嘗試:作爲其不可能與標準映射做到這一點

class CustomTest 
{ 
    public virtual string A { get; set; } 

    private Test2 _test2; 
    private Test2 Test2 { get { return _test2 ?? (_test2 = new Test2()); } set { _test2 = value; } } 

    public virtual string X 
    { 
     get { return Test2.X; } 
     set { Test2.X = value; } 
    } 

    private Test3 Test3 
    { 
     get { return Test2.Test3 ?? (Test2.Test3 = new Test3()); } 
     set { Test2.Test3 = value; } 
    } 

    public virtual string Y 
    { 
     get { return Test3.Y; } 
     set { Test3.Y = value; } 
    } 
} 

class CustomTestMap : ClassMap<CustomTest> 
{ 
    public CustomTestMap() 
    { 
     Table("Test1Table"); 

     // Id() same as Test1 

     Map(ct => ct.A); 
     References(Reveal.Member<CustomTest>("Test2")).Cascade.All(); 
    } 
} 

// alternativly這是脆,費時和犯規讓選擇(或其中大部分)

class CustomTestMap : ClassMap<CustomTest> 
{ 
    public CustomTestMap() 
    { 
     Table("Test1Table"); 

     Id(...) 

     SqlInsert("INSERT INTO Test1Table (...) VALUES (?, ...); INSERT INTO Test2Table (...) VALUES (?, ...); INSERT INTO Test2Table (...) VALUES (?, ...)"); 
     SqlUpdate("UPDATE Test1Table SET ...; UPDATE ..."); 
     SqlDelete("UPDATE Test1Table SET ...; UPDATE ..."); 
     SqlDeleteAll(...); 

     Map(ct => ct.A); 
     Map(ct => ct.X); 
     Map(ct => ct.Y); 
    } 
} 
+0

這是不正確的,因爲用戶想擁有一個自動更新的類。 – Rippo 2012-02-23 13:59:29