流利的NHibernate有时找不到记录(返回null)

时间:2013-03-15 07:02:21

标签: c# nhibernate fluent

我用

获取一个映射的实体
using (var session = myFactory.OpenSession())
  {
    using (var transaction = session.BeginTransaction())
      {
        try{
          var myEntity = session.Get<T>(myId);
          ...
          transaction.Commit();
          if (myEntity == null)
            throw new ObjectNotFoundException(id, typeof(T));
          return myEntity;
        }
        catch (HibernateException ex)
        {
         // logging
         if (!transaction.WasCommitted)
           transaction.Rollback();
         throw ex;
         }
      } // transaction
   } // session

问题在于有时会找到实体,有时却找不到。

启动程序时不会执行任何实体修改。

如果我在session.Get()之后停止执行并执行NHibernate生成的SQL,则会找到该行。

如果我在session.Get()之后停止执行,并且在Visual Studio的Watch部分中执行带有另一个有效id的相同语句,那么也会找到另一个实体。

session.Get()后,session.IsConnectedsession.IsOpen返回true

为什么NHibernate找不到实体?

修改

这是哈希码和equals方法。 Id是一个字符串。

public override int GetHashCode()
{
  int hashCode = 0;
  hashCode = hashCode ^ Id.GetHashCode();
  return hashCode;
}

public override bool Equals(object obj)
{
  if(obj.GetType()!=typeof(MyEntity))
    return false;

  MyEntity compareTo = obj as MyEntity;
  return compareTo.Id == this.Id;
}

EDIT2

当找到实体并且我调用session.QueryOver<MyEntity>().List().ToList()时,除了我请求的实体之外,找到所有其他实体。

EDIT3

我定义了一个与.Column("colName").Access.ReadOnly()映射的关系。 现在,当加载程序(即使用实体的视图)时,尝试更新关系。但是,这可能失败了,因为未从数据库(.Column("colName").Access.ReadOnly())加载关系,并且未遵守外键约束。从那时起,再也找不到所请求的实体。

现在我想知道为什么在重新启动应用程序时无法加载我的实体,因为更改(空外键引用)不在数据库中(即数据库仍然一致)。

0 个答案:

没有答案