Получить только идентификатор моего объекта ManyToOne - PullRequest
0 голосов
/ 01 августа 2011

У меня есть это отображение:

[Class(Table = "foo", Name = "Foo")]
public class Foo
{
    [Id(0, TypeType = typeof(long), Name = "Id", Column = "id")]
    [Generator(1, Class = "native")]
    public virtual long Id { get; set; }

    [ManyToOne(Class = "Bar", Column = "bar_id", NotNull = true)]
    public virtual Bar Bar { get; set; }
}

[Class(Table = "bar", Name = "Bar")]
public class Bar
{
    [Id(0, TypeType = typeof(long), Name = "Id", Column = "id")]
    [Generator(1, Class = "native")]
    public virtual long Id { get; set; }

    [Bag(0, Inverse = true, Table = "foo", Cascade = "save-update")]
    [Key(1, Column = "bar_id", ForeignKey = "fk_foo_bar_id")]
    [OneToMany(2, Class = "Foo")]
    public virtual IList<Foo> Foos { get; set; }
}

, и я хотел бы сделать запрос SQL:

SELECT bar_id FROM foo f WHERE f.id = 1

Я знаю, что могу сделать

Session.Get<Foo>(1).Bar.Idтем не менее, он загружает объект Bar и, если это очень объект HEAVY , мой простой запрос, который требует только того, что находится внутри таблицы foo, очень медленный.Как мне это сделать?

Я думал о добавлении свойства, подобного этому

[Property(Column = "bar_id", NotNull = true)]
public virtual long BarId { get; set; }

Но я не знаю, является ли оно неправильным или нет, или мне следует сделать это иначе.

Ответы [ 3 ]

0 голосов
/ 01 августа 2011

Попробуйте использовать Session.Load<Foo>(id).

NHibernate должен быть достаточно умен, чтобы понимать, что ему не нужно загружать Bar и генерировать прокси-версию, содержащую только его ID. Он загрузит Bar, только если вы получите доступ к другому из его свойств.

Однако Session.Get() не делает этого , поскольку использует кэширование. Но если вы измените это на Session.Load<Foo>(id), вы должны увидеть это поведение.

0 голосов
/ 02 августа 2011

Наконец мы сделали это так:

public class FooToBarResult
{
    public string FooId { get; set; }
    public int BarId { get; set; }
}

IList<BlockToComponentResult> result = session
       .CreateSQLQuery(@"SELECT bar_id as BarId, id as FooId FROM `foo`")
       .SetResultTransformer(Transformers.AliasToBean<FooToBarResult>())
       .List<FooToBarResult>();

Я пришел к выводу, что NHibernate - это круто, если вы делаете только то, что они от вас хотят, но как только у вас возникает проблема с производительностью и вы хотите оптимизировать запрос, вам нужно вернуться к SQL, и боль начинается.

0 голосов
/ 01 августа 2011

NHibernate поддерживает ленивые свойства . Проверьте, решает ли это вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...