Как изменить столбец, используя функциональность nhibernate SchemaUpdate - PullRequest
11 голосов
/ 02 ноября 2011

У меня есть сущностная модель, которую я хочу отображать в базе данных каждый раз, когда я запускаю приложение, но без очистки данных, поэтому я использую SchemaUdpate с беглым методом отображения nhibernate

var config = Fluently.Configure().Database
(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString));
//here I add mappings , apply conventions, build configuration, etc...
//
new SchemaUpdate(configuBuild).Execute(doUpdate: true, script: true);

Таким образом, моя модель сущности обновляется корректно почти все время.Проблема в том, что когда я изменяю определение свойства, допустим, что у меня было такое свойство

 [CustomSqlType("nvarchar(400)")]
 public virtual string Name { get; set; }

CustomSqlType, это просто атрибут, который будет применяться в соответствии с определенным соглашением при загрузке отображений.В этом случае свойство Name будет создано как поле nvarchar(400).Но если в будущем я изменю определение на этот

 [CustomSqlType("nvarchar(500)")]
 public virtual string Name { get; set; }

, то будет сгенерирован правильный файл hbm.xml (правильный означает nvarchar (500)), но столбец в базе данных не обновляется, хотя такое изменениедействует с точки зрения БД.Можно ли изменить (создать сценарий изменения) существующий столбец с новым ограничением длины / точности / обнуляемого значения, используя SchemaUpdate?

1 Ответ

11 голосов
/ 02 ноября 2011

Хорошо, я обнаружил, что это невозможно, ниже приведен код, выполняемый SchemaUpdate

foreach (Column column in ColumnIterator)
        {
            IColumnMetadata columnInfo = tableInfo.GetColumnMetadata(column.Name);
            if (columnInfo != null)
            {
                continue;
            }

            // the column doesnt exist at all.
            // other not important code
        }

Как вы видите, по умолчанию он ничего не делает, если столбец существует.

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