【发布时间】:2012-08-15 17:52:02
【问题描述】:
我正在尝试使用 CF 为现有数据库构建模型。我有一列忘记设置合理的默认值。而不是通过更改初始迁移的纯度来妥协,我只是想我会创建另一个迁移(这就是迁移的目的,对吧?:)
public override void Up()
{
AlterColumn("Config", "DefaultTaxPerDollar", c => c.Decimal(nullable: false, precision: 19, scale: 5, defaultValue: 0.087m));
}
public override void Down()
{
AlterColumn("Config", "DefaultTaxPerDollar", c => c.Decimal(nullable: false, precision: 19, scale: 5, defaultValue: 0.0m));
}
但这会从 SQL Server 产生Column already has a DEFAULT bound to it. 错误。
如何使用 CF 迁移更改默认值?或者,如何简单地删除一个默认值(然后用不同的值重新创建它)?
编辑:
这是生成的 SQL:
ALTER TABLE [Config] ADD CONSTRAINT DF_DefaultTaxPerDollar DEFAULT 0.087 FOR [DefaultTaxPerDollar]
ALTER TABLE [Config] ALTER COLUMN [DefaultTaxPerDollar] [decimal](19, 5) NOT NULL
我想我可能已经找到了一个解决方案,将Sql() 方法与一些受this 帖子启发的复杂SQL 结合使用。问题源于 SQL Server 使用约束来实现默认值(哦!我多么想念 MySQL!)并为约束生成名称。因此,Code First 团队不能简单地更改或删除/重新创建默认值。
【问题讨论】:
-
能贴出生成的SQL吗?
-
是的,这就是我的观点。我预计迁移只会添加约束,但不会检查/删除现有的约束。我认为这可以被视为一个错误。
-
您能提供您的解决方案作为答案吗?
-
会做 - 一旦我确定它:) 我很确定这会起作用,但由于实际的 SQL 是由 AlterColumnOperation 对象构建的,然后发送到服务器一下子,我的自定义 SQL 必须与所有生成的 SQL 配合得很好,事实证明这有点棘手。当我开始工作时会发布。
-
仅供参考,这应该在 E6 中修复(参见 Work Item 452)
标签: c# entity-framework-5 entity-framework-migrations