如何使用NHibernate的SchemaUpdate功能修改列

11

我有一个实体模型,我想每次运行应用程序时都将其反映到数据库中,但不清除数据,因此我使用了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个回答

12

好的,我发现这是不可能的,下面是由 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
        }

正如你所看到的,如果该列存在,则默认情况下它不执行任何操作。


真的很糟糕。你最终是怎么强制更新你的模式的? - Gaute Løken
谢谢!我花了很长时间试图找出为什么它似乎不更新我的默认约束!- 你设法找到解决方法了吗? - Zack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接