//============================================================
// Auto generated by CodeSmith, at: 2012/9/5 21:57:44
//============================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using log4net;
using NHibernate.Context;
namespace BMW.Core.Dao {
public class NHibernateUtil {
/// <summary>
/// 全域唯一的SessionFactory
/// </summary>
public static readonly ISessionFactory SessionFactory;
//靜態塊,初始化讀取 Hibernate 配置
static NHibernateUtil() {
try {
Configuration cfg = new Configuration();
SessionFactory = cfg.Configure().BuildSessionFactory();
}
catch (Exception ex) {
ILog logger = LogManager.GetLogger("NHibernateHelper Logger");
if (logger.IsErrorEnabled)
logger.Error("NHibernate initialization failed.Exception:{0}",ex);
throw;
}
}
/// <summary>
/// 綁定Session上下文管理,與current_session_context_class配置節相關,應在請求開始時執行
/// </summary>
public static void BindSession() {
ISession session = SessionFactory.OpenSession(); ;
CurrentSessionContext.Bind(session);
}
/// <summary>
/// 解除Session上下文管理綁定,釋放Session對象。與current_session_context_class配置節相關,應在請求結束時執行。
/// </summary>
public static void UnbindSession() {
ISession session = CurrentSessionContext.Unbind(NHibernateUtil.SessionFactory);
session.Dispose();
}
/// <summary>
/// 擷取當前內容相關的Session
/// </summary>
public static ISession CurrentSession {
get {
return SessionFactory.GetCurrentSession();
}
}
/// <summary>
/// 在當前會話中開始事務Hibernate並返回事務對象,應用using釋放
/// </summary>
public static ITransaction BeginTransaction() {
return CurrentSession.BeginTransaction();
}
}
}
//============================================================
// Auto generated by CodeSmith, at: 2012/9/5 21:57:44
//============================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using System.Web;
using NHibernate.Context;
using log4net;
namespace BMW.Core.Dao {
public class NHibernateDao<T, TKey> {
public ISession Session {
get {
return NHibernateUtil.CurrentSession;
}
}
public T Insert(T entity) {
Session.Save(entity);
return entity;
}
public T Update(T entity) {
Session.Merge(entity);
return entity;
}
public void Delete(T entity) {
Session.Delete(entity);
}
public T FetchByKey(TKey key) {
return Session.Get<T>(key);
}
public IList<T> GetAll() {
return Session.CreateCriteria(typeof(T)).List<T>();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using BMW.Core.Dao;
using System.Transactions;
namespace BMW.Core.Test {
[TestFixture]
public class TestBase {
[TestFixtureSetUp]
public void TestFixtureSetUp() {
NHibernateUtil.BindSession();
}
[TestFixtureTearDown]
public void TestFixtureTearDown() {
NHibernateUtil.UnbindSession();
}
//TransactionScope tx = null;
//[SetUp]
//public void SetUp() {
// tx = new TransactionScope();
//}
//[TearDown]
//public void TearDown() {
// tx.Dispose();
//}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using BMW.Core.Biz;
using BMW.Core.Model;
namespace BMW.Core.Test
{
[TestFixture]
public class PositionBizTest:TestBase
{
private PositionBiz target = new PositionBiz();
[TestCase]
public void GetAllTest() {
Assert.AreEqual(5, target.GetAll().Count);
}
[TestCase]
public void FetchPositionByNameTest()
{
Assert.AreEqual(1, target.FetchPositionsByName("員工").Id);
}
[TestCase]
public void FetchByKeyTest() {
Assert.IsNotNull(target.FetchByKey(2));
}
[TestCase]
public void AddTest() {
Position p = new Position { Name = "員工" };
//輸入重複職位名字,應拋出異常
Assert.Throws<BusinessException>(() => target.Add(p));
//不存在則添加
p = new Position { Name = "所長" };
target.Add(p);
Assert.AreEqual(6,target.GetAll().Count);
}
//產看當前職位ID是被外鍵使用,true為使用中,false未使用
[TestCase]
public void CheckPositionIsReferencedTest() {
Assert.IsTrue(target.CheckPositionIsReferenced(1));
Assert.IsFalse(target.CheckPositionIsReferenced(2));
}
[TestCase]
public void UpdateTest() {
//修改職位名稱,如果修改的名稱在表裡面已經存在,則拋出異常
Position p = target.FetchByKey(4);
p.Name = "經理";
Assert.Throws<BusinessException>(() => target.Update(p));
//如果是唯一,則成功
p.Name = "班長";
target.Update(p);
Assert.AreEqual("班長", target.FetchByKey(4).Name);
}
[TestCase]
public void CheckPositionIsUsedTest() {
//如果職位被應用,返回true
Position p = new Position { Id = 1 };
Assert.IsTrue(target.CheckPositionIsUsed(p.Id));
p.Id = 2;
Assert.IsFalse(target.CheckPositionIsUsed(p.Id));
}
[TestCase]
public void DeleteByIdTest() {
//如果職位在員工表中有應用則拋出異常
Position p = target.FetchByKey(1);
Assert.Throws<BusinessException>(() => target.DeleteById(p.Id));
//刪除成功之後,資料不存在返回null
target.DeleteById(3);
Assert.IsNull(target.FetchByKey(3));
}
}
}