c# - 不允许修改 Column 对象的 DefaultConstraintName 属性
问题描述
我正在尝试在一个旧项目上使用官方的 Microsoft.SqlServer.SharedManagementObjects NuGet 包,该项目在 SMO 2014 上运行良好。当我尝试添加或编辑列的默认值时,我写了以下内容:
var server = new Server("(local)");
var database = new Database(server, "test_db");
database.Create();
var table = new Table(database, "test_tbl");
var columnKey = new Column(table, "key", DataType.Int);
columnKey.Identity = true;
columnKey.IdentitySeed = 0;
columnKey.IdentityIncrement = 1;
table.Columns.Add(columnKey);
var columnVal = new Column(table, "val", DataType.Int);
columnVal.AddDefaultConstraint("defVal").Text = "1";
table.Columns.Add(columnVal);
table.Create();
columnVal.DefaultConstraint.Drop();
columnVal.Refresh();
columnVal.AddDefaultConstraint("defVal").Text = "2";
columnVal.Alter();
database.Drop();
Column 实例上的最后一个 Alter() 引发异常:
System.InvalidOperationException:Microsoft SMO 在提交期间失败:Microsoft.SqlServer.Management.Smo.FailedOperationException:更改列“val”失败。---> Microsoft.SqlServer.Management.Smo.SmoException:不允许修改 Column 对象的 DefaultConstraintName 属性。您必须删除并重新创建具有所需属性的对象。
2016 SMO 中不存在“DefaultConstraintName”属性(根据官方文档)。它是 SMO 的错误还是我能做的其他事情?
解决方案
好的,这就是答案:在 COLUMN 上添加默认约束需要更改 TABLE,而不是更改列,而不是调用columnVal.Alter()我需要调用table.Alter()。现在我考虑到这一点,这似乎很明显,因为当您需要添加默认约束时,您实际上会使用以下 SQL 命令:
ALTER TABLE [test_tbl]
ADD CONSTRAINT [defVal] DEFAULT ((2)) FOR [val]
像往常一样,Microsoft 框架/库会提供有关实际情况的糟糕信息(请参阅引发的异常消息)。我希望这对其他人有用。
推荐阅读
- linux - linux上的VS Code,各种权限错误
- mongodb - 如何解决“MongoError: $where is not allowed in this atlas tier”?
- android - 如何从 HEIF 格式获取旋转数据?
- python - setuptools的“编程语言”分类器中版本的目的是什么?
- saucelabs - 适用于 Android/IOS 酱实验室的 Webdriver.io
- mongodb - 创建一个可以访问特定数据库上的 listCollections 的 mongo 用户
- webpack - 自定义 Webpack 插件:访问转换代码的钩子
- php - 避免在 SSH 命令中区分大小写
- rest - 如何在加特林中使用单个用户对多个请求进行负载测试
- ios - 关于在 Swift 中将 Int 类型的值分配给 String 类型