使用NHibernate SchemaUpdate与MySQL的问题 - 没有错误,但没有任何反应!

时间:2011-03-03 17:40:11

标签: mysql nhibernate fluent-nhibernate

我在使用SchemaUpdate和MySQL时遇到了一些问题。

似乎已经正确实现了所有内容,但是当我运行它时 它没有更新任何东西。它不会产生任何错误 暂停你想要的那种时间长度 采取检查数据库架构,但它根本不更新任何东西, 当我试图让它编写改变脚本时,它就是不行 任何事情 - 它就好像它可以;检测到数据库的任何变化 schema,但我创建了一个新实体和一个新的映射类 - 所以我 不知道为什么它没有把它拿起来。

       var config = Fluently.Configure()
               .Database(() => {
                   var dbConfig = MySQLConfiguration.Standard.ConnectionString(
                    c => c.Server(configuration.Get<string>("server", ""))
                        .Database(configuration.Get<string>("database",""))
                        .Password(configuration.Get<string>("password", ""))
                        .Username(configuration.Get<string>("user", ""))
                   );


               });

       config.Mappings(
           m => m.FluentMappings
                   .AddFromAssemblyOf<User>()
                   .AddFromAssemblyOf<UserMap>()
                   .Conventions.AddFromAssemblyOf<UserMap>()
                   .Conventions.AddFromAssemblyOf<PrimaryKeyIdConvention>()
           //      .PersistenceModel.Add(new CultureFilter())
               );


       var export = new SchemaUpdate(config);
       export.Execute(false, true);

我认为我的配置没有任何问题,因为它有效 完美地使用ShemaExport - 它只是我看起来的SchemaUpdate 有问题。

任何想法都会非常感激!

2 个答案:

答案 0 :(得分:1)

您是否尝试在事务中包装SchemaUpdate执行?有些数据库需要在事务AFAIK中运行它。

using (var tx = session.BeginTransaction())
{
    var tempFileName = Path.GetTempFileName();
    try
    {
        using (var str = new StreamWriter(tempFileName))
        {
            new SchemaExport(configuration).Execute(showBuildScript, true, false, session.Connection, str);
        }
    }
    finally
    {
        if (File.Exists(tempFileName))
        {
            File.Delete(tempFileName);
        }
    }

    tx.Commit();
}

答案 1 :(得分:0)

我明白了:

问题是MySQL没有多个数据库。似乎MySQL和/或NHibernate的某些部分使用Schema而SchemaUpdate似乎是其中之一。所以,当我有

Database=A

在我的connectionstring和

<class ... schema="B">

在映射中,然后SchemaUpdate似乎认为此类是“用于不同的数据库”并且不会更新它。

我现在能想到的唯一解决方法是为每个模式执行一次SchemaUpdate(首先调用USE schema;)。但是afaik,NHibernate没有接口来获取映射中使用的所有模式的列表(如果我错了,请纠正我)。我担心我必须手动迭代XML文件(我使用基于XML的映射)并收集它们......