映射自定义NHibernate类(如视图)

时间:2012-02-16 17:20:41

标签: nhibernate fluent-nhibernate

我有几个班级/映射......一切正常...... 有时创建视图以获得更好的性能......

我想知道在不创建数据库视图的情况下创建特殊映射是否可行...

示例,我有:

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;
}

它可以吗?

1 个答案:

答案 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);
    }
}