如何在不使用PK的情况下使用NHibernate返回一个对象?

时间:2011-12-20 09:28:36

标签: c# sql-server-2008 nhibernate c#-4.0

我的C#4应用程序中有一个名为Market的对象:

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

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

我在SQL Server中有一个名为markets的表:

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

我知道这是错误的但是有没有办法返回一个映射到数据库中一个唯一行的对象,但通过PK检索它?我可以简单地获得一个<IList>市场对象,然后使用'foreach'返回一个,但这对我来说感觉不雅。

1 个答案:

答案 0 :(得分:4)

如果您使用NH 3+,可以使用LINQ:

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

或QueryOver:

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