Автоматическая проверка схемы с использованием NHibernate / ActiveRecord - PullRequest
0 голосов
/ 29 августа 2009

Предположим, у меня есть таблица продуктов со столбцами: Id, Name, Price и используя NHibernate (или ActiveRecord) я сопоставляю таблицу с POCO:

public class Product
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    public virtual double Price { get; set; }
}

Теперь, если когда-нибудь появится новый столбец с именем ShipmentPrice (предположим, он тоже двойной) будет добавлен в таблицу «Продукты». Могу ли я узнать это автоматически?

Для автоматического выражения я имею в виду добавление кода для этого или получение исключения? (Я предполагаю, что не могу контролировать столбцы таблицы или способ заранее знать о любых изменениях в схеме таблицы)

Ответы [ 2 ]

3 голосов
/ 10 сентября 2009

Вы правильно помните, Маурисио. Следующий код показывает, как вы можете создать или обновить схему. Обновление будет запущено, когда Validate () вызовет исключение. Исключение не будет выдано, когда поле доступно в базе данных, но не в конфигурации. Совершенно законно иметь дополнительные поля: надеюсь, вы не хотите, чтобы они были удалены? Это может нанести огромный ущерб ...

Следующий код показывает Test, Create, Validate и Update, каждый шаг с правильной обработкой исключений. Код упрощен, но он должен дать вам представление о том, как выполнить проверку.

Этот код помогает в конфигурациях ORM, ориентированных на сущности (POCO), где вы можете добавить поле в свой класс, и оно будет автоматически обновлено в базе данных. Не с табличным центром, где поля являются ведущими.

// executes schema script against database
private static void CreateOrUpdateSchema(Configuration config)
{
    // replace this with your test for existence of schema
    // (i.e., with SQLite, you can just test for the DB file)
    if (!File.Exists(DB_FILE_NAME))
    {
        try
        {
            SchemaExport export = new SchemaExport(config);
            export.Create(false, true);
        }
        catch (HibernateException e)
        {
            // create was not successful
            // you problably want to break out your application here
            MessageBox.Show(
                String.Format("Problem while creating database: {0}", e),
                "Problem");
        }
    }
    else
    {

        // already something: validate
        SchemaValidator validator = new SchemaValidator(config);
        try
        {
            validator.Validate();
        }
        catch (HibernateException)
        {
            // not valid, try to update
            try
            {
                SchemaUpdate update = new SchemaUpdate(config);
                update.Execute(false, true);
            }
            catch (HibernateException e)
            {
                // update was not successful
                // you problably want to break out your application here
                MessageBox.Show(
                    String.Format("Problem while updating database: {0}", e),
                    "Problem");
            }
        }
    }
}

- Авель -

0 голосов
/ 29 августа 2009

Вы можете использовать SchemaValidator от NHibernate , но IIRC проверяет только правильность сопоставленных сущностей, поэтому он не проверяет, есть ли больше столбцов, чем сопоставленные свойства, поскольку это не действительно ломает ваше приложение.

...