如何使用NHibernate不使用PK返回一个对象?

问题描述:

我有一个对象在我的C#叫Market 4应用:如何使用NHibernate不使用PK返回一个对象?

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

我想要做同样的事情,但在符号票代替。 Symbol在数据库中是唯一的,我想返回一个Market对象。我想这样的代码:

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

我知道这是不对的,但有没有办法返回一个对象,它映射到一个独特的行中的数据库,但不通过 PK找回?我可以简单地获得Market对象的<IList>,然后使用'foreach'返回该对象,但这对我来说感觉不合适。

+0

你不想使用标准或HQL? – 2011-12-20 10:55:04

+0

我接受最优雅的解决方案。你会用什么? – 2011-12-20 12:34:41

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

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

或者QueryOver:

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

感谢'QueryOver'是我使用的方法。 – 2011-12-20 17:46:42