如何使用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'返回该对象,但这对我来说感觉不合适。
答
如果使用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
你不想使用标准或HQL? – 2011-12-20 10:55:04
我接受最优雅的解决方案。你会用什么? – 2011-12-20 12:34:41