我用
获取一个映射的实体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.IsConnected
和session.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()
)加载关系,并且未遵守外键约束。从那时起,再也找不到所请求的实体。
现在我想知道为什么在重新启动应用程序时无法加载我的实体,因为更改(空外键引用)不在数据库中(即数据库仍然一致)。