【问题标题】:Integrating NHibernate with MySql将 NHibernate 与 MySql 集成
【发布时间】:2014-08-16 09:58:41
【问题描述】:

几天来,我一直在尝试将 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();
    }
}

【问题讨论】:

  • 你有没有试过调用 BeginTransaction,保存后尝试调用 session.Flush()

标签: c# mysql nhibernate fluent-nhibernate


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多