实体框架 6 迁移以在 Oracle 中将 CLOB 列更改为 VARCHAR
Posted
技术标签:
【中文标题】实体框架 6 迁移以在 Oracle 中将 CLOB 列更改为 VARCHAR【英文标题】:Entity Framework 6 Migration to change CLOB column to VARCHAR in Oracle 【发布时间】:2016-07-04 06:30:09 【问题描述】:我正在尝试使用 EF 6 迁移在 oracle 中将 CLOB 列更改为 VARCHAR(2000)。当 EF 构建迁移文件时,我的 Up() 方法中有以下代码行:
AlterColumn("MTA.PLAN_SHEETS", "PLANSHEET_NAME", c => c.String(maxLength: 2000, unicode: false));
当我运行迁移时出现此错误
列的修改无效
我知道在 Oracle 中我们不能直接将 Clob 更改为 Varchar:How to change a dataype CLOB TO VARCHAR2(sql)
在实体框架迁移中将 Clob 更改为 Varchar 的最佳方法是什么?
【问题讨论】:
有人回答这个问题吗?我无意中允许 EF6 创建 CLOB 而不是 NVARCHAR2。现在我需要将它们更改为 VARCHAR2,但我不想丢失现在列中的数据 您需要使用上面链接中的基本步骤在 2 或 3 次迁移中执行此操作。首先添加 varchar2 列,重命名 CLOB 列并添加脚本命令以复制数据。然后您可以进行第二次迁移以将 varchar2 重命名为原始 CLOB 列名。测试它,当您满意时添加第三次迁移以删除 CLOB。 【参考方案1】:可能在所有 RDBMS 中都存在同样的问题。 我总是使用与此类似的代码,我认为(我很确定)这是唯一的方法。
AddColumn("MTA.PLAN_SHEETS", "TMP_COLUMN", c => c.String(maxLength: 2000, unicode: false));
Sql(@"UPDATE MTA.PLAN_SHEETS SET TMP_COLUMN = PLANSHEET_NAME");
DropColumn("MTA.PLAN_SHEETS", "PLANSHEET_NAME");
RenameColumn("MTA.PLAN_SHEETS", "TMP_COLUMN", "PLANSHEET_NAME");
【讨论】:
这是一个迁移问题,因此这些步骤将分批运行。简单的方法是运行多个迁移。另一种方法是使用extension 在每个语句之后插入“GO”语句。【参考方案2】:你可以使用
dbms_lob.substr(clob_column, for_how_many_bytes, from_which_byte);
例如:
从 T 中选择 dbms_lob.substr(x, 4000, 1);
【讨论】:
以上是关于实体框架 6 迁移以在 Oracle 中将 CLOB 列更改为 VARCHAR的主要内容,如果未能解决你的问题,请参考以下文章
ADO.NET 实体框架 - 带有实体框架 6 的 Oracle
无法生成显式迁移 - 具有多个上下文/配置的实体框架 6.1.3