我对nhibernate 3.3.3 GA有一个非常奇怪的问题
我正在更新一个实体,我可以看到它已更新,如果我从SQL运行它,但当我读取它时,我得到原始结果,更新的数据将恢复一些如何。我认为这与缓存有关,所以我用
更新了我的配置<property name="cache.use_query_cache" >false</property>
但我仍然遇到同样的问题。当我更新记录时,我在事务中执行它并提交事务。所以我希望它立即回复。
这让我发疯,并且不知道在哪里寻找。任何想法都将不胜感激。
涉及的课程很少,让我们看看我是否可以在这里复制一些以提供更多细节
我有一个管理我的会话的类,这就是提交我的事务的方式
public void CommitTransaction(string sessionFactoryName)
{
ITransaction transaction =
(ITransaction)contextTransactions[sessionFactoryName];
try
{
if (transaction != null && !transaction.WasCommitted
&& !transaction.WasRolledBack)
{
transaction.Commit();
contextTransactions.Remove(sessionFactoryName);
}
}
catch (HibernateException)
{
RollbackTransaction(sessionFactoryName);
throw;
}
}
并在我的配置隔离级别设置为ReadCommitted
我对这个类的映射看起来像这样。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DataLoad.Biz.Patient, DataLoadBiz" table="Patient" lazy="false">
<id name="ID" column="oid" type="Guid">
<generator class="guid" />
</id>
<many-to-one name="practice"
column="practice"
class="DataLoad.Biz.Practice, DataLoadBiz" />
<many-to-one name="mailingAddress"
column="mailingAddress"
class="DataLoad.Biz.PatientAddress, DataLoadBiz" />
<bag name="addresses" lazy="false">
<key column="patient"/>
<one-to-many class="DataLoad.Biz.PatientAddress, DataLoadBiz"/>
</bag>
<bag name="mailings" table="MAILING_PATIENT">
<key column="patient"></key>
<many-to-many column="mailing" class="DataLoad.Biz.Mailing, DataLoadBiz" />
</bag>
<property name="title" column="title" />
<property name="forename" column="forename" />
<property name="surname" column="surname" />
<property name="head" column="head" />
<property name="groupRef" column="groupRef" />
<property name="dob" column="dob" />
<property name="status" column="status" />
<property name="notes" column="notes" />
<property name="softDeleted" column="softDeleted" />
</class>
<sql-query name="cspProcessblahvlah">
Exec cspProcessblahvlah
:practiceOid,
:xmlDoc
</sql-query>
</hibernate-mapping>
所以当我保存实体时,我使用以下来发送更新
NHibernateSessionManager.Instance.BeginTransaction(DBName);
patientDao.SaveOrUpdate(patient);
NHibernateSessionManager.Instance.GetSession(DBName).FlushMode = FlushMode.Always;
NHibernateSessionManager.Instance.CommitTransaction(DBName);
NHibernateSessionManager.Instance.GetSession(DBName).Clear();
查看数据库我可以在此之后看到它在数据库中,但是当我在WCF服务中调用以下方法时
IPatientDao patented = daoFactory.GetPatientDao ();
IList<Patient> dbPatients = patented.GetPatientsForPractice (practiced, competitor, false);
public IList GetPatientsForPractice(Guid pr, string competitor, bool processed)
{
ICriteria cr = NSManager.Instance.GetSession(DBName).CreateCriteria(typeof(Patient));
if (practice != Guid.Empty)
{
ICriteria practiceCriteria = cr.CreateCriteria("pr");
practiceCriteria.Add(Expression.Eq("ID", practice));
}
cr.Add(Expression.Eq("processed", processed));
cr.Add(Expression.Like("competitor", competitor));
IList patients = cr.List();
return patients;
}
有时(现在大部分时间)我在更新之前获得原始数据。
谢谢你们。我以为我错过了一些明显的东西,但现在花了好几天没有线索......