我有几个班级/映射......一切正常...... 有时创建视图以获得更好的性能......
我想知道在不创建数据库视图的情况下创建特殊映射是否可行...
示例,我有:
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 :(得分: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();
}
}
//交替,这是脆弱和耗时的,不允许选择(或大多数)
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);
}
}