代码之家  ›  专栏  ›  技术社区  ›  xandy

如何告诉会话抛出错误查询[NHibernate]?

  •  0
  • xandy  · 技术社区  · 15 年前

    我针对存储库方法创建了一个测试类,如下所示:

            public void AddFile<TFileType>(TFileType FileToAdd) where TFileType : File
      {
       try
       {
        _session.Save(FileToAdd);
        _session.Flush();
       }
       catch (Exception e)
       {
        if (e.InnerException.Message.Contains("Violation of UNIQUE KEY"))
         throw new ArgumentException("Unique Name must be unique");
        else
         throw e;
       }
      }
    
            public void RemoveFile(File FileToRemove)
      {
       _session.Delete(FileToRemove);
       _session.Flush();
      }
    

                try
       {
        Data.File crashFile = new Data.File();
        crashFile.UniqueName = "NonUniqueFileNameTest";
        crashFile.Extension = ".abc";
        repo.AddFile(crashFile);
        Assert.Fail();
       }
       catch (Exception e)
       {
        Assert.IsInstanceOfType(e, typeof(ArgumentException));
       }
    
       // Clean up the file
       Data.File removeFile = repo.GetFiles().Where(f => f.UniqueName == "NonUniqueFileNameTest").FirstOrDefault();
       repo.RemoveFile(removeFile);
    

    测试失败。当我介入调查问题时,我发现_会话.刷新()之后_会话.删除(),它抛出异常,如果我看看它所做的sql,它实际上提交了一个“INSERT INTO”语句,这正是导致唯一约束错误的sql。我试图在事务中封装这两者,但还是发生了相同的问题。有人知道原因吗?


    编辑

    另一个保持不变,只是按照建议增加了驱逐

            public void AddFile<TFileType>(TFileType FileToAdd) where TFileType : File
      {
       try
       {
        _session.Save(FileToAdd);
        _session.Flush();
       }
       catch (Exception e)
       {
       _session.Evict(FileToAdd);
        if (e.InnerException.Message.Contains("Violation of UNIQUE KEY"))
         throw new ArgumentException("Unique Name must be unique");
        else
         throw e;
       }
      }
    

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jamie Ide    15 年前

    呼叫 _session.Evict(FileToAdd) catch 阻止。尽管保存失败,FileToAdd仍然是会话中的一个临时对象,NH将在下次刷新会话时尝试将其持久化(插入)。

        2
  •  0
  •   AJ.    15 年前

    NHibernate手册“最佳实践”第22章:

    发生异常,请回滚ITransaction并关闭ISession。 如果不这样做,NHibernate就不能保证内存状态 准确表示持久状态。作为一个特例, 请勿使用负载ISession()来确定 数据库中存在标识符;请改用Get()或查询。