代码优先迁移中列的 EF6 Oracle 默认值
Posted
技术标签:
【中文标题】代码优先迁移中列的 EF6 Oracle 默认值【英文标题】:EF6 Oracle default value for a column in code first migration 【发布时间】:2016-05-14 07:54:28 【问题描述】:我正在尝试编写一个迁移,使用 EntityFramework 6 为我的 Oracle 数据库中的 NUMBER 列设置 默认值。这是我第一次尝试没有设置默认值:
public override void Up()
AddColumn("MTA.PLAN_SHEETS", "QUANTITY_CHANGED", c => c.Decimal(nullable: true, precision: 3, scale: 0, defaultValueSql: "1"));
我还尝试使用defaultValue
代替defaultValueSql
,但它再次没有为该列设置默认值。
我的迁移代码有什么问题吗?
【问题讨论】:
【参考方案1】:我在使用 Oracle 和 EF6 时遇到了同样的问题。 Oracle 提供商似乎不支持它。不过有一个解决方法,以防您还没有找到。
您首先需要在您的模型(或 Fluent API,无论您在哪里处理)中将 QuantityChanged 属性设置为可为空。然后您可以运行 add-migration 命令,该命令将使用“Up”方法中的“AddColumn”方法生成迁移文件。之后,添加显式 SQL 命令以将所有值更新为所需的默认值。如果您需要该列不为 NULL,则需要另一个 SQL 命令来修改该列并将其设置为 NOT NULL。
public override void Up()
AddColumn("MTA.PLAN_SHEETS", "QUANTITY_CHANGED", c => c.Decimal(precision: 3, scale: 0));
Sql("UPDATE MTA.PLAN_SHEETS SET QUANTITY_CHANGED = 1");
Sql("ALTER TABLE MTA.PLAN_SHEETS MODIFY QUANTITY_CHANGED NOT NULL");
我希望这会有所帮助。如果需要,请参考我的问题:How do I set a default value for a new column using EF6 migrations?
【讨论】:
我确认 oracle 驱动程序 6.122.1.0 确实存在此错误,并且此解决方法有效。奇怪的是 CreateTable 操作似乎没有受到这个错误的影响。 Oracle 的开发人员不知何故记得要尊重那里的“defaultValue”参数,但在其他地方却没有。去图...以上是关于代码优先迁移中列的 EF6 Oracle 默认值的主要内容,如果未能解决你的问题,请参考以下文章