【问题标题】:NHibernate 3.0 and LINQ: what am I missing?NHibernate 3.0 和 LINQ:我错过了什么?
【发布时间】:2011-01-29 00:56:57
【问题描述】:

我最近决定将我的 Web 应用程序从 NHibernate 2.1 升级到 NH 的最新版本 3.0。我还决定从 .NET 2.0 升级到 3.5,以便更好地兼容 Mono(webapp 只在 Linux 中运行),因为它已经足够成熟了。

我想尝试一下 LINQ 和 NHibernate,因为我还看到 NHibernate.Linq 命名空间包含在发行版中。

但是,当我尝试使用 ISession 实例编写 LINQ 时,我没有得到 Linq<T> 方法。

我阅读了许多博客文章,为了使用 LINQ to NH,您必须使用 NHContrib 包。

我的问题是

我还需要下载 NHContrib 吗? NH 的 3.0 版本比 NHContrib 的 LINQ to NH 更新得多,我看到版本中包含了 Linq 命名空间

或者,

是因为 Visual Studio 2010 升级了 2.0->3.5 框架吗?我仔细检查了目标框架 IS 3.5。

不幸的是,除了完整的类文档之外,我找不到关于 NH 3.0 的全面文档,这对于 NH 开发人员来说比通用开发更有用

谢谢。

【问题讨论】:

    标签: c# linq nhibernate


    【解决方案1】:

    NHibernate 3.0 内置了自己的 LINQ 提供程序b,您可以通过 .Query

    访问它

    因此您不再需要 Ayende 的 NHibernate.Linq 提供程序。

    此外,NHibernate 3.0 Cookbook 可能会帮助您。

    https://www.packtpub.com/nhibernate-3-0-cookbook/book

    【讨论】:

      【解决方案2】:

      另外请注意,内置 LINQ 提供程序不支持 Where 子句中的 .Equals 方法,您需要改用 ==。例如,以下内容曾经在 2x 中与 NHibernate.Linq 一起使用:

      (from e in myEntities where e.Name.Equals(nameLookup) select e)
      

      你现在需要做的

      (from e in myEntities where e.Name == nameLookup select e)
      

      【讨论】:

      • 你能解释得更好吗?我需要在对象之间执行值比较:您的示例可能显示了一个可以与 == 进行比较的字符串,但我的对象重载了 Equals() 方法以执行主键比较。我应该明确比较主键而不是完整对象吗?示例(从 e.Boss.Equals(me) 选择 e 的员工中的 e),其中 Boss 类型为 Person,我该怎么办?
      • 我们也这样做,我们只是使用== 运算符,即:where e.Boss == me select e
      • (我们所有的东西过去都是.Equals,作为迁移到3.0的一部分,我们必须将查询更新为==,它们仍然像以前一样工作)
      • 嗯 - 说在 3.0.0GA 中已修复 - 这就是我下载的。奇怪。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多