【问题标题】:How to return one object using NHibernate without using PK?如何在不使用 PK 的情况下使用 NHibernate 返回一个对象?
【发布时间】:2011-12-20 09:28:36
【问题描述】:

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

我想做同样的事情,但传入 Symbol 代替。符号在数据库中是唯一的,我想返回一个市场对象。我正在尝试这段代码:

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

我知道这是错误的,但是有没有办法返回一个映射到数据库中唯一行但通过 PK 检索它的对象?我可以简单地获取一个 &lt;IList&gt;of Market 对象,然后使用“foreach”返回那个对象,但这对我来说并不优雅。

【问题讨论】:

  • 您不想使用 Criteria 或 HQL?
  • 我愿意接受最优雅的解决方案。你会用什么?

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


【解决方案1】:

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

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

或查询结束:

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

【讨论】:

  • 谢谢QueryOver是我使用的方法。
猜你喜欢
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2015-08-03
相关资源
最近更新 更多