Integrating NHibernate with MySql

本文关键字:MySql with NHibernate Integrating | 更新日期: 2023-09-27 18:10:26

这几天我一直在尝试连接NHibernate和MySQL。我正在使用存储库模式,它可以很好地从数据库中获取数据。然而,我不能保存数据。代码没有返回错误,但是数据没有插入到数据库中。这一切看起来都很简单,而且它确实返回数据。我只是不知道如何调试的事实,它没有返回任何错误,当我执行Nhibernate SaveOrUpdate方法,但不保存任何东西。

这是使用Repository保存Person对象的代码;

  [Test]
    public void Given_New_User_When_Saved_User_Can_Be_Detected()
    {
        Person testPerson = new Person("George", "Candle");
        IRepository repository = new RepositoryBase();
        repository.Save(testPerson);
        List<Person> personList = repository.ToList<Person>();
        Assert.IsTrue(personList.Exists(x => x.FirstName == "George"));
    }

下面是RepositoryBase代码:

公共类RepositoryBase: IRepository, IDisposable

{
    protected ISession _session = null;
    protected ITransaction _transaction = null;

    public RepositoryBase()
    {
        _session = Database.OpenSession();
    }
    public RepositoryBase(ISession session)
    {
        _session = session;
    }
    //Transaction and Session Management Methods
    public void BeginTransaction()
    {
        _transaction = _session.BeginTransaction();
    }
    public void CommitTransaction()
    {
        _transaction.Commit();
        CloseTransaction();
    }
    public void RollbackTransaction()
    {
        _transaction.Rollback();
        CloseTransaction();
        CloseSession();
    }
    private void CloseSession()
    {
        _session.Close();
        _session.Dispose();
        _session.Flush();
        _session = null;
    }
    private void CloseTransaction()
    {
        _transaction.Dispose();
        _transaction = null;
    }
    //IRepository members
    public virtual void Save(object obj)
    {
        _session.SaveOrUpdate(obj);
    }

}

这是数据库类

公共静态类数据库{私有静态ISessionFactory _sessionFactory;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                string connString = "server=172.16.20.38;Port=3306;userid=root;database=KanbanDevelopment;password=;Persist Security Info=True;";

                _sessionFactory = Fluently.Configure()
                    .Database(MySQLConfiguration.Standard
                        .ConnectionString(connString))
                   // .ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(true, true, false))
                    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>())
                    .BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }
    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}

Integrating NHibernate with MySql

这是一个简单的改变。我需要使用_session.Save(obj)而不是_session.SaveOrUpdate(obj)。这解决了我的问题,但我不知道为什么SaveOrUpdate不工作。摆弄我的代码,我能够生成一个"NHibernate"。StaleObjectStateException:行被另一个事务更新或删除(或未保存值映射不正确)"。关于StackOverflow的一个建议是使用_session。保存,这两个问题都解决了。