NHibernate中的静态查找

时间:2009-07-31 13:25:51

标签: nhibernate lookup

我想在NHibernate中使用一些预定义的查找而无需轮回到数据库。

基本上我想要这样的代码:

public class Countries
{
  static Countries() {
    Australia = new Country
      {
          Id = 14,
          Description = "Australia"
      }
  }
  public static Country Austrlia { get; protected set }
}

然后编写此代码片段:

address.Country = Countries.Australia;// Snippet1
if (address.Country == Countries.Australia) { // Snippet2
  // Do something
}

所以我确实重写了Equals,GetHashCode,甚至重载了运算符==和!=用于Country类查找。

仅当具有给定Id的国家/地区尚未加载到内存中时,Snippet1才会起作用。 否则抛出NonUniqueObjectException,表示具有给定Id的对象已经在内存中。

为了解决这个问题,我必须逐出加载的国家/地区,然后分配查找值。 这感觉不对,我不确定当国家查询的查询将再次执行时会发生什么。

所以问题是:如何在NHibernate中维护静态查找类?

谢谢, 德米特里。

2 个答案:

答案 0 :(得分:2)

查看我们称之为Enumeration classes ..

的内容

它基本上是 flyweight 模式。

您可以使用IUserType实现将其保留为值或显示名称。

我们用它们做疯狂的事情。就像为DBA伙伴提供带有外键的自动生成的查找表,同时保留代码中的所有值。

答案 1 :(得分:1)

似乎NHibernate无法在逻辑上处理2个对象(但不同的实例) 因此,不要将“静态查找”与数据库查找混合使用,最好只使用其中一个。

在我的情况下 - 查找存储在数据库中。但是为了避免往返数据库只是为了获取对象,只需要使用Load而不是Get:

address.Country = Session.Load<Country>(CountryIds.Australia); // This does not hit DB
address.Country = Session.Get<Country>(CountryIds.Australia); // This DOES hit DB