c# - 如何使用 nhibernate SchemaUpdate 功能更改列

标签 c# .net nhibernate c#-4.0 fluent-nhibernate

我有实体模型,我想在每次运行应用程序时将其反射(reflect)到数据库,但不清除数据,因此我在某种程度上使用 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 更改(生成更改脚本)具有新长度/精度/可空约束的现有列?

最佳答案

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

如您所见,如果该列存在,默认情况下它什么都不做。

关于c# - 如何使用 nhibernate SchemaUpdate 功能更改列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7981115/

相关文章:

c# - C# 中是否有任何 Int24 实现?

javascript - C# Websocket 远程方未完成关闭握手就关闭了WebSocket连接

.Net 3.5 和 SQL Server 2005 选择 DAL 技术

c# - 持续运行的服务器

asp.net - 关于生成可打印报告/发票的建议?

nhibernate - NHibernate 上关于 Entity Framework 的导航属性是否有类似的东西?

c# - 使用新的 RDP 客户端保持事件代码失败

c# - 当表中存在记录时,Azure 表存储查询不会从有效筛选器中检索任何实体

c# - Azure 上的 Cyber​​Source

c# - nHibernate SetFirstResult & SetMaxResults 问题