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

NHibernate存储库模式问题

  •  2
  • user366312  · 技术社区  · 14 年前

    我正在应用程序中使用nhibernate和存储库模式。但不想使用UnitOfWork模式。

    我的应用程序中有两种类型的表单。收集/选取窗体和实体窗体。

    但当表单在另一个表单中显示dialog()ged时,就会出现问题。

    当我执行任何与数据库相关的操作时,nhibernate会给我提供“具有相同标识符值的另一个对象已经与会话:xyz”错误相关联。这是由于clr延迟调用Dispose方法造成的,据我猜测,我的另一个问题是会话管理。

    如何更改存储库代码以解决我的问题?

    记住,我不想在我的存储库中公开单独的beginTransaction()、commitTransaction()类函数。这些东西应该嵌入到每个方法saveorupdate()、save()、delete、load()等中。正如我已经做的那样。

    请告诉我怎样才能使小改动的事情顺利进行?

    我在做这样的事情:

    选取器窗体的工作方式如下:

    private void btnpick_ck(object sender,eventargs e)
    {
    courseCollectionForm f=新建courseCollectionForm();
    f.formviewMode=formviewMode.multiplePicker;
    F.StdidiAudio();
    
    int总学分=0;
    int总小时数=0;
    
    FillDataGridViewWithCourses(f.pickedcoursecollection,ref totalcredits,ref totalhours);
    
    FillTotal(总学分,总小时数);
    }
    < /代码> 
    
    

    保存的工作方式如下:

    公共部分类部门EntityForm:Form
    {
    private departmentrepository _deptrepositiony=空;
    private department _currentdepartment=空;
    private formviewmode _currentmode=formviewmode.none;
    
    公共部门实体窗体(部门,窗体视图模式)
    {
    初始化组件();
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    Dept Collection Form

    Dept Entity Form

    private void btnPick_Click(object sender, EventArgs e)
            {
                CourseCollectionForm f = new CourseCollectionForm();
                f.FormViewMode = FormViewMode.MultiplePicker;
                f.ShowDialog();
    
                int totalCredits = 0;
                int totalHours = 0;
    
                FillDataGridViewWithCourses(f.PickedCourseCollection, ref totalCredits, ref totalHours);
    
                FillTotal(totalCredits, totalHours);
            }
    

    public partial class DepartmentEntityForm : Form
        {
            private DepartmentRepository _deptRepository = null;
            private Department _currentDepartment = null;
            private FormViewMode _currentMode = FormViewMode.None;
    
            public DepartmentEntityForm(Department dept, FormViewMode mode)
            {
                InitializeComponent();
    
                _deptRepository = new DepartmentRepository();
    
                _currentDepartment = dept;
                _currentMode = mode;
    
                if(mode == FormViewMode.Edit)
                {
                    MapObjectToControls();
                }
            }
    
            private void SaveButton_Click(object sender, EventArgs e)
            {
                Department newDept;
    
                if (mode == FormViewMode.AddNew)
                {
                    newDept = new Department();
                }
                else if(mode == FormViewMode.Edit)
                {
                    newDept = _currentDepartment;
                }
                //.............
                //.............
    
                _deptRepository.SaveOrUpdate(newDept);
            }
        }
    

    public class FacultyRepository : Repository<Faculty>
        {
        }
    

    public class DepartmentRepository : Repository<Department>
        {
        }
    

    public class Repository<T> : IRepository<T>
        {
            ISession _session;
    
            public Repository() 
            {
                _session = SessionFactory.GetOpenSession();
            }
    
            public T Get(object id)
            {
                T obj = default(T);
    
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        obj = (T)_session.Get<T>(id);
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
    
                return obj;
            }
    
            public IEnumerable<T> Get(string fieldName, object fieldValue)
            {
                IEnumerable<T> list = null;
    
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        list = (IEnumerable<T>)_session.CreateCriteria(typeof(T))
                            .Add(new NHibernate.Expression.EqExpression(fieldName, fieldValue))
                            .List<T>();
    
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
    
                return list;
            }
    
            public IEnumerable<T> Get()
            {
                IEnumerable<T> list = null;
    
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        list = (IEnumerable<T>)_session.CreateCriteria(typeof(T)).List<T>();
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
    
                return list;
            }
    
            public void SaveOrUpdate(T obj)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        _session.SaveOrUpdateCopy(obj);
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
            }
    
            public void SaveOrUpdate(IEnumerable<T> objs)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
    
                        foreach (T obj in objs)
                        {
                            _session.SaveOrUpdate(obj);
                        }
    
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
            }
    
            public void Delete(T obj)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        _session.Delete(obj);
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();                
                    _session.Clear();
    
                    throw ex;
                }
            }
    
            public void Delete(IEnumerable<T> objs)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
    
                        foreach (T obj in objs)
                        {
                            _session.Delete(obj);
                        }
    
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
            }
    
            public void DeleteAll()
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
    
                        DetachedCriteria criterion = DetachedCriteria.For<T>();
                        IList<T> list = criterion.GetExecutableCriteria(_session).List<T>();
    
                        foreach (T item in list)
                        {
                            _session.Delete(item);
                        }
    
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
    
                    throw ex;
                }
            }
    
            public void Dispose()
            {
                if (_session != null)
                {
                    _session.Clear();
                    _session.Close();
                    _session = null;
                }
            }
        }
    

    public class SessionFactory
        {
            private static ISessionFactory _sessionFactory = null;
            private SessionFactory(){}
    
            static SessionFactory()
            {
                if (_sessionFactory == null)
                {
                    Configuration configuration = new Configuration();
                    configuration.Configure();
                    _sessionFactory = configuration.BuildSessionFactory();
                }
            }
    
            public static ISession GetOpenSession()
            {
                return _sessionFactory.OpenSession();
            }
        }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   user366312    14 年前

    好了,伙计们!我已经很久没有发表我的问题了,没有人愿意回答。

    我通过制造 ISession static SessionFactory 而不是返回打开的 ISession 对于每个存储库,我只返回一个 static 遗赠 .