您可以爲一個關聯創建類/映射,但不能嵌套。你可以在映射中使用自定義的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);
}
}
「CustomTest」是隻讀類嗎?或者你想發送更新到三個表? – Rippo 2012-02-17 05:20:30
不,更新到三個表... – Paul 2012-02-23 10:56:31
我不認爲這是可能的單獨映射,你將需要手動你自己的'更新',而不是依靠會話被骯髒。 – Rippo 2012-02-23 14:00:32