Отображение пользовательского класса NHibernate (например, представление) - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть несколько классов / сопоставлений ... Все работает нормально ... Иногда создается представление для лучшей производительности ...

Я хотел бы знать, возможно ли создатьспециальное отображение без создания представления БД ...

Например, у меня есть:

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 Ответ

1 голос
/ 17 февраля 2012

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