您可以为一个关联创建类/映射,但不能嵌套。你可以在映射中使用自定义的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