我开发了一个使用nHibernate的WCF api。我是新来的。我使用session.update来处理事务。我有一个for循环,其中基于选择条件我正在更新记录即。如果tabel1中存在A,那么我正在更新表,否则插入一个新条目。
我收到“无法执行查询”。尝试通过在表中添加新条目来对先前正在更新的表执行选择查询时。
我的想法是,因为我正在使用session.save(table1),然后尝试从该表中选择条目,我收到一个错误。由于session.save临时锁定表,因此我无法在该表上执行select查询。
这可以解决这个问题吗?
更新: 这个for循环用于检查数据库中的某些字段:
using (ITransaction tranx = session.BeginTransaction())
{
savefunction();
tranx.Commit();
}
保存功能:
public void savefunction()
{
for (int i = 0; i < dictionary.Count; i++)
{
ICandidateAttachmentManager candidateAttach = new ManagerFactory().GetCandidateAttachmentManager();
CandidateAttachment attach = new CandidateAttachment();
attach = checkCV();
if(attach == null)
{
//insert new entry into table attach
session.save(attach);
}
}
}
checkCV功能:
public void checkCV()
{
using (ICandidateAttachmentManager CandidateAttachmentManager = new ManagerFactory().GetCandidateAttachmentManager())
{
IList<CandidateAttachment> lstCandidateAttachment = CandidateAttachmentManager.GetByfkCandidateId(CandidateId);
if (lstCandidateAttachment.Count > 0)
{
CandidateAttachment attach = lstCandidateAttachment.Where(x => x.CandidateAttachementType.Id.Equals(FileType)).FirstOrDefault();
if (attach != null)
{
return null;
}
else
{
return "some string";
}
}
}
}
这里发生的是for循环,如果说i = 2,则附加值为null,表示我正在输入附加表中的新条目。然后当i = 3时,当它进入checkCV函数时,我在这一行得到一个错误:
IList lstCandidateAttachment = CandidateAttachmentManager.GetByfkCandidateId(CandidateId);
我认为这是因为我使用session.save然后尝试读取tabel内容我无法执行查询并且表被锁定直到我提交会话。在beginTransaction和commit之间,与该对象关联的表被锁定。我怎样才能做到这一点?任何想法?
更新 我读了一些帖子。看起来我需要为事务设置隔离级别。但即使添加后它似乎也无效。以下是我试图补充的方法:
using (ITransaction tranx = session.BeginTransaction(IsolationLevel.ReadUncommitted))
{
saveDocument();
}
答案 0 :(得分:0)
我在您的代码中无法理解的内容是您获得nHibernate会话的地方。
确实你使用
new ManagerFactory().GetCandidateAttachmentManager();
和
using (ICandidateAttachmentManager CandidateAttachmentManager = new ManagerFactory().GetCandidateAttachmentManager())
所以你的ManagerFactory类为你提供了ISession?
然后你做:
CandidateAttachment attach = new CandidateAttachment();
attach = checkCV();
但
checkCV() returns either a null or a string ?
最后你永远不应该做
Save()
但是
SaveOrUpdate()
希望能帮助您解决问题。
随意提供更多详情