вы можете создать класс / отображение для одной ассоциации, но не вложенные.Вы можете перейти с настраиваемым 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();
}
}
// альтернативно, что является хрупким и трудоемким и не позволяет выбирать (или большинство из них)
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);
}
}