2012-02-20 65 views
0
namespace HRProject.Test 
{ 
    using NUnit.Framework; 
    using NHibernate; 
    using HRProject.Model; 
    using HRProject.Setup; 
    using HRProject.Utils; 
    using NHibernate.Linq; 

    [TestFixture] 
    public class RepositoryTest 
    { 
     [SetUp] 
     public void SetUp() 
     { 
      ISession session = SessionHelper.GetSession(); 

      using (ITransaction tx = session.BeginTransaction()) 
      { 
       foreach (Cashier c in session.Query<Cashier>().ToList<Cashier>()) 
       { 
        session.Delete(c); 
       } 

       tx.Commit(); 
      } 

      using (ITransaction tx = session.BeginTransaction()) 
      { 
       Cashier c1 = new Cashier(){Description = "D.Rathnayaka"}; 
       Cashier c2 = new Cashier(){Description = "K.Kumara"}; 
       Cashier c3 = new Cashier(){Description = "R.Gunapala"}; 

       session.Save(c1); 
       session.Save(c2); 
       session.Save(c3); 

       tx.Commit(); 
      } 
     } 

     [Test] 
     public void TestLoadUp() 
     { 
      ISession session = SessionHelper.GetSession(); 

      using (ITransaction tx = session.BeginTransaction()) 
      { 
       Repository<Cashier> repo = new Repository<Cashier>(); 
       Assert.AreEqual(3, repo.Items.Count); 
       Assert.AreEqual(1, (from Cashier c in repo.Items 
          where c.Description == "D.Rathnayaka" 
          select true).Count()); 

       tx.Commit(); 
      } 
     } 

     [Test] 
     public void TestUpdate() 
     { 
      ISession session = SessionHelper.GetSession(); 

      using (ITransaction tx = session.BeginTransaction()) 
      { 
       Repository<Cashier> repo = new Repository<Cashier>(); 
       Cashier cas = (from Cashier c in repo.Items 
          where c.Description == "D.Rathnayaka" 
          select c).Single(); 
       cas.Description = "K.R"; 
       session.Flush(); 
       tx.Commit(); 
      } 



      using (ITransaction tx = session.BeginTransaction()) 
      { 
       Repository<Cashier> repo = new Repository<Cashier>(); 
       //Fails here// 
       Assert.IsNotNull((from Cashier c in repo.Items 
            where c.Description == "K.R" 
            select c).Single()); 
      } 
     } 
    } 
} 

有人能告诉我为什么这个测试失败吗?数据库也不会更新。该库类如下:NHibernate db没有更新

namespace HRProject.Utils 
{ 
    using NHibernate; 
    using HRProject.Setup; 
    using NHibernate.Linq; 

    class Repository<T> where T : class 
    { 
     public IList<T> Items {get; set;} 

     public Repository() 
     { 
      Items = new List<T>(); 

      ISession session = SessionHelper.GetSession(); 
      using (ITransaction tx = session.BeginTransaction()) 
      { 
       List<T> list = session.Query<T>().ToList(); 

       foreach (T obj in list) 
       { 
        Items.Add((T)session.Merge(obj)); 
       } 

       tx.Commit(); 
      } 
     } 

     public void AddRepositoryObject(T obj) 
     { 

     } 
    } 
} 
+0

测试失败时会出现什么错误?它在哪里失败? – Dimitar 2012-02-20 06:09:58

+0

HRProject.Test.RepositoryTest.TestUpdate: System.InvalidOperationException:序列不包含任何元素 - 您可以通过搜索'// Fails here //'在此代码中找到它 – nakiya 2012-02-20 06:11:18

+0

您是否尝试在会话之前提交事务? – 2012-02-23 21:15:48

回答

1

我不知道你SessionHelper.GetSession方法的实现细节,但我怀疑它在每次调用打开新的会话。如果这是真的,那么你的测试TestUpdate有两个独立的会话对象。您在测试方法内打开一个会话,另一个会话由Repository打开。您更新第二个会话对象所拥有的实体,但您在第一个会话中提交了事务。每个交互应该只有一个会话对象(每个会话的会话)。考虑将会话存储在CurrentSessionContext对象中。

+0

我不会在'SessionHelper.GetSession'中每次创建一个新会话。我有一个静态的'ISession',它在程序的整个生命周期中保持打开状态。 – nakiya 2012-02-21 03:59:05