簡體   English   中英

如何在NHibernate中執行更新?

[英]How to execute update in NHibernate?

我正在嘗試執行對對象的更新,但是它總是會引發異常, illegally attempted to associate a proxy with two open session 我可以插入,但不能更新。

我該如何解決?

數據庫連接

    public class DBConnect {

            private static ISessionFactory session;
            private const String HOST = "localhost";
            private const String USER = "root";
            private const String PASSWORD = "";
            private const String DB = "pubcontrol";

            /** create a connection with database */
            private static ISessionFactory createConnection() {

                if (session != null)
                    return session;

                //database configs
                FluentConfiguration _config = Fluently.Configure().Database(MySQLConfiguration.Standard.ConnectionString(
                                                                           x => x.Server(HOST).
                                                                              Username(USER).
                                                                              Password(PASSWORD).
                                                                              Database(DB)
                                                                            ))
                                                                            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<PerfilMap>())
                                                                            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ModuloMap>())
                                                                            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<PermissaoMap>())
                                                                            .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true));

                session = _config.BuildSessionFactory();
                return session;
            }


            /** open a session to make transactions */
            public static ISession openSession() {
                return createConnection().OpenSession();
            }
        }

通用DAO

public class GenericDAO<T> : IPersist<T> where T : class {

        public void insert(T obj) {
            ISession _session = DBConnect.openSession();
            ITransaction _transaction = _session.BeginTransaction();
            try {
                _session.Save(obj);
                _transaction.Commit();
            }catch (Exception e) {
                if (!_transaction.WasCommitted) {
                    _transaction.Rollback();
                }
                MessageBox.Show("Erro tentando salvar: " + e.Message, "Aviso",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        public void update(T obj) {
            ISession _session = DBConnect.openSession();
            ITransaction _transaction = _session.BeginTransaction();
            try {
                _session.Update(obj);
                _transaction.Commit();
            }catch (Exception e) {
                if (!_transaction.WasCommitted) {
                    _transaction.Rollback();
                }
                MessageBox.Show("Erro tentando alterar: " + e.Message, "Aviso", 
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



        public void delete(T obj) {
            ISession _session = DBConnect.openSession();
            ITransaction _transaction = _session.BeginTransaction();
            try {
                _session.Delete(obj);
                _transaction.Commit();
            }catch (Exception e) {
                if (!_transaction.WasCommitted) {
                    _transaction.Rollback();
                }
                MessageBox.Show("Erro tentando deletar: " + e.Message, "Aviso", 
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



        public T findObject(long id) {
            ISession _session = DBConnect.openSession();
            return _session.Load<T>(id);
        }


        public void saveOrUpdate(T obj) {
            ISession _session = DBConnect.openSession();
            ITransaction _transaction = _session.BeginTransaction();
            try {
                _session.SaveOrUpdate(obj);
                _transaction.Commit();
            }catch (Exception e) {
                if (!_transaction.WasCommitted) {
                    _transaction.Rollback();
                }
                MessageBox.Show("Erro tentando salvar ou alterar: " + e.Message, "Aviso",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }

准證

public class PermissaoDAO : GenericDAO<Permissao> {

        public IList<Permissao> findAll() {
            ISession _session = DBConnect.openSession();
            IList<Permissao> list = _session.CreateQuery("FROM Permissao p")                
                .List<Permissao>();
            return list;
        }


        /** verifica se o perfil ou o modulo estao adicionados */
        public Boolean isExistPerfilAndModulo(Permissao permissao) {
            ISession _session = DBConnect.openSession();
            IList<Permissao> list = _session.CreateQuery("FROM Permissao p WHERE p.perfil = :p AND p.modulo = :m")
                .SetParameter("p", permissao.perfil)
                .SetParameter("m", permissao.modulo)
                .List<Permissao>();
            if (list.Count > 0) {
                return true;
            }
            return false;
        }

        /** retorna a permissao */
        public Permissao getPermissao(Permissao permissao) {
            ISession _session = DBConnect.openSession();
            IList<Permissao> list = _session.CreateQuery("FROM Permissao p WHERE p.perfil = :p AND p.modulo = :m").SetMaxResults(1)
                .SetParameter("p", permissao.perfil)
                .SetParameter("m", permissao.modulo)
                .List<Permissao>();
            return list[0];
        }


    }

進行更新

/** insere Perfil + Modulo */
        private void insertPerfilModulo() {
            PermissaoDAO dao = new PermissaoDAO();
            Perfil perfil = (Perfil)cbxPerfilModulo.SelectedItem;
            IList<Modulo> lista = getListaModulo();

            foreach(Modulo m in lista){                
                Permissao permissao = new Permissao();
                permissao.perfil = perfil;
                permissao.modulo = m;

                Boolean exist = dao.isExistPerfilAndModulo(permissao);                
                if (exist) {
                    Permissao p = dao.getPermissao(permissao);
                    dao.update(p);
                }else {
                    dao.insert(permissao);
                }
            }
        }

您不應將多個會話與同一個對象一起使用。 您不應該為每個數據庫操作都創建一個事務,這樣事務就沒有任何意義。 每個會話和事務都涉及整個業務操作,並且不要忘記最后都將其關閉(或處置)。

會話中每個對象的更新都是隱式的。 會話管理已查詢或插入的每個對象。

使用NHibernate時,代碼通常看起來像這樣(示例,根據您設計DAO的方式,看起來可能非常不同,但是概念應該相同):

using (session = dao.CreateSession())
using (session.CreateTransaction())
{
  var myObject = dao.Get<MyObject>(id);
  if (myObject == null)
  {
    myObject = new MyObject();
    dao.Insert(myObject);
  }
  myObject.Property = 3;
  dao.Commit();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM