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

用NHibernate保存物体的正确方法是什么?

  •  0
  • Leg10n  · 技术社区  · 16 年前

    我刚开始休眠,刚开始映射到一个表,但是当我试图写一个对象时遇到了一些问题,这里是我的单元测试:

    [TestFixture]
    public class FacilityRepositoryTest : DatabaseRepositoryTestsBase
    {
        private IRepository<Facility> repository = new Repository<Facility>();
    
        [Test]
        public void CanGetAllFacilities()
        {
            IList<Facility> allFacilities=repository.GetAll();
            Assert.IsNotNull(allFacilities);
            foreach (Facility facility in allFacilities)
            {
                Console.WriteLine(facility.NAME);
            }
        }
        [Test]
        public void CanCreateOneFacility()
        {
            try
            {
                repository.DbContext.BeginTransaction();
                Facility facility = new Facility();
                facility.FACILITY_CODE = "abc";
                facility.NAME = "Nameds";
                facility.ADDRESS = "Reinhardt strasse";
                repository.SaveOrUpdate(facility);
                repository.DbContext.CommitTransaction();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
    

    当我奔跑 CanCreateOneFacility ,我得到这个例外:

    TestCase 'PJ1.TestUsingDevDb.PJ1Web.Data.FacilityRepositoryTest.CanCreateOneFacility'
    failed: TearDown : NHibernate.TransactionException : Transaction not successfully started
    --TearDown
    en NHibernate.Transaction.AdoTransaction.CheckBegun()
    en NHibernate.Transaction.AdoTransaction.Rollback()
    

    我开始调试测试,没有异常被抛出,数据被记录,但是测试完成后,异常就出现了。

    我做错什么了?这是保存对象的错误方法吗?

    1 回复  |  直到 16 年前
        1
  •  0
  •   Rian Schmits    16 年前

    你使用的是S ARP架构,对吧?我相信数据库库测试数据库 已经为您提供了一个事务,因此您不必在测试代码中设置一个事务。所以尝试移除:

    repository.DbContext.BeginTransaction();
    

    和

    repository.DbContext.CommitTransaction();
    

    看看是否有效。