代码优先迁移中列的 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 默认值的主要内容,如果未能解决你的问题,请参考以下文章

EF6(代码优先)单个外键属性上的多个导航属性

EF6 使用列默认值创建代码优先表

如何将sqlalchemy中列的默认值设置为关系中列的值?

oracle 用户在 EF6 Code First 中创建数据库和执行挂起迁移的最低权限是啥

EF6 Migration 自动迁移未执行

如何检查oracle中列的所有值是不是相同