Проблема с использованием NHibernate SchemaUpdate с MySQL - без ошибок, но ничего не происходит! - PullRequest
3 голосов
/ 03 марта 2011

У меня были некоторые проблемы с использованием SchemaUpdate с MySQL.

I кажется, правильно все реализовал, но когда я его запускаю, он ничего не обновляет.Он не генерирует никаких ошибок и делает паузу примерно на тот промежуток времени, который вы ожидаете от него, чтобы проверить схему БД, но он просто ничего не обновляет, и когда я пытаюсь заставить его написать сценарийизменить его просто ничего не делает - это как если бы он мог; не обнаружил каких-либо изменений в схеме БД, но я создал новую сущность и новый класс отображения - поэтому я не могу понять, почему он не поднимает его.

       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 ]

1 голос
/ 05 июля 2011

Вы пытались обернуть выполнение 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();
}
0 голосов
/ 11 апреля 2014

Я понял это:

Проблема в том, что MySQL не имеет нескольких баз данных. Кажется, что некоторые части MySQL и / или NHibernate используют схемы вместо этого, и SchemaUpdate, кажется, одна из них. Поэтому, когда у меня есть

Database=A

в моей строке подключения и

<class ... schema="B">

в отображении, то SchemaUpdate, кажется, думает, что этот класс "для другой базы данных" и не обновляет его.

Единственное исправление, о котором я сейчас могу подумать, это сделать SchemaUpdate для каждой отдельной схемы (сначала вызывая USE schema;). Но, на самом деле, NHibernate не имеет интерфейса для получения списка всех схем, которые используются в сопоставлениях (поправьте меня, если я ошибаюсь). Боюсь, мне придется вручную перебирать файлы XML (я использую сопоставления на основе XML) и собирать их ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...