2012-02-16 50 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