Как вернуть один объект с помощью NHibernate без использования PK? - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть объект с именем Market в моем приложении C # 4:

public class Market : BusinessBase
{
    public Market()
    {
    }

    public virtual int Id { get; set; }
    public virtual string Symbol { get; set; }
    public virtual string Description { get; set; }
}

У меня есть таблица с именем markets в SQL Server:

CREATE TABLE [dbo].[markets](
    [marketId] [int] IDENTITY(1,1) NOT NULL,
    [symbol] [varchar](10) NOT NULL,
    [description] [varchar](30) NOT NULL,
    [version] [int] NOT NULL,
 CONSTRAINT [PK_markets] PRIMARY KEY CLUSTERED 
    ([marketId] ASC)
GO
CREATE UNIQUE NONCLUSTERED INDEX [NIDX_markets_symbol] ON [dbo].[markets] ([symbol] ASC)
GO

Мой файл сопоставлениявыглядит так:

<class name="MooDB.BusinessLayer.Market" table="markets">
    <id name="Id" column="marketId" type="Int32">
        <generator class="native" />
    </id>           
    <version name="Version" column="version" type="integer" unsaved-value="0" />
    <property name="Symbol" column="symbol" type="string" length="10" />
    <property name="Description" column="description" type="string" length="30" not-null="true" />        
</class>

Я могу получить рынок из базы данных по Id, просто используя этот метод:

public Market GetMarketById(int marketId)
{
    ISession session = GetSession();
    return session.Get<Market>(marketId);
}

Я хочу сделать то же самое, но вместо этого передать Символ.Символ принудительно задан в базе данных, и я хочу вернуть объект Market.Я пытаюсь этот код:

public Market GetMarketBySymbol(string symbol)
{
    ISession session = GetSession();
    return session.Get<Market>(symbol);
}

Я знаю, что это неправильно , но есть ли способ вернуть один объект, который отображается в одну уникальную строку в базе данных, но не восстановить его по ПК?Я мог бы просто получить <IList> объектов Market и затем просто вернуть объект, используя 'foreach', но мне это не по вкусу.

1 Ответ

4 голосов
/ 20 декабря 2011

Если вы используете NH 3+, вы можете использовать LINQ:

return session.Query<Market>().SingleOrDefault(w => w.Symbol == symbol);

Или QueryOver:

return session.QueryOver<Market>()
  .Where(w => w.Symbol == symbol).SingleOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...