Nhibernate SaveOrUpdate不提交

时间:2014-01-18 01:59:36

标签: asp.net sql-server nhibernate

我对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;    
}

有时(现在大部分时间)我在更新之前获得原始数据。

谢谢你们。我以为我错过了一些明显的东西,但现在花了好几天没有线索......

0 个答案:

没有答案