Entity Framework 6迁移以在Oracle中将CLOB列更改为VARCHAR

Entity Framework 6迁移以在Oracle中将CLOB列更改为VARCHAR,oracle,entity-framework,entity-framework-6,entity-framework-migrations,Oracle,Entity Framework,Entity Framework 6,Entity Framework Migrations,我正在尝试使用EF 6迁移将oracle中的CLOB列更改为VARCHAR(2000)。在迁移文件中,我的Up()方法中有以下代码行: AlterColumn("MTA.PLAN_SHEETS", "PLANSHEET_NAME", c => c.String(maxLength: 2000, unicode: false)); 当我运行迁移时,我得到了这个错误 对列的修改无效 我知道在Oracle中,我们不能直接将Clob更改为Varchar: 在实体框架迁移中,将Clob更改为Va

我正在尝试使用EF 6迁移将oracle中的CLOB列更改为VARCHAR(2000)。在迁移文件中,我的Up()方法中有以下代码行:

AlterColumn("MTA.PLAN_SHEETS", "PLANSHEET_NAME", c => c.String(maxLength: 2000, unicode: false));
当我运行迁移时,我得到了这个错误

对列的修改无效

我知道在Oracle中,我们不能直接将Clob更改为Varchar:


在实体框架迁移中,将Clob更改为Varchar的最佳方法是什么?

可能所有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");
你可以用

dbms_lob.substr(clob_列,表示_多少字节,来自哪个字节)

例如:


从T中选择dbms_lob.substr(x,4000,1)

有人能回答这个问题吗?我无意中允许EF6创建CLOB而不是NVARCHAR2。现在,我需要将它们更改为VARCHAR2,但我不想丢失列中的数据。现在,您需要使用上面链接中的基本步骤在2或3次迁移中执行此操作。首先添加varchar2列,重命名CLOB列并添加脚本命令以复制数据。然后可以进行第二次迁移,将varchar2重命名为原始CLOB列名。测试它,并在您满意时添加第三次迁移以删除CLOB。这是一个迁移问题,因此这些步骤将在批处理中运行。简单的方法是运行多个迁移。另一种方法是在每个语句后面插入“GO”语句。