私はオブジェクトが私のC#4のアプリケーションでMarket
と呼ばれるがあります。PKを使わずにNHibernateを使ってオブジェクトを返す方法は?
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でそれを取得し、私はこれは間違っである知っているが、データベースに1つの一意の行にマップのオブジェクトを返す方法があるが、ない?私は単に市場オブジェクトの<IList>
を取得し、それからちょうど 'foreach'を使用して1つを返すことができますが、それは私にとって不愉快であると感じます。
return session.Query<Market>().SingleOrDefault(w => w.Symbol == symbol);
またはQueryOver:あなたはLINQを使用することができます3+あなたはNHを使用している場合
あなたは、基準またはHQLを使用したくありませんか? –
私は最も洗練されたソリューションを提供しています。何を使用しますか? –