c.String()); //custom copy data from old BinCode column-6ren">
gpt4 book ai didi

c# - Entity Framework 迁移自定义 SQL 不起作用

转载 作者:行者123 更新时间:2023-11-30 20:38:53 24 4
gpt4 key购买 nike

为什么这不起作用?

AddColumn("dbo.Bins", "Code", c => c.String());
//custom copy data from old BinCode column
Sql("UPDATE Bins SET Code = BinCode WHERE BinCode IS NOT NULL");
DropColumn("dbo.Bins", "BinCode");

Bins 具有设置了值的 Bin.BinCode,当我在 DbMigration 中运行它时,我发现 Bin.Code 为 NULL

编辑:我实际上并没有在包管理器控制台中运行 Update-Database,而是从我的工作单元源执行:

        Database.SetInitializer<eVendContext>(new MigrateDatabaseToLatestVersion<eVendContext, Configuration>());

编辑 2:澄清一下,数据库正在成功更新到最新的迁移。很简单,完成后数据不会从 BinCode 字段复制到 Code 字段。

编辑 3:这是 Update-database -verbose 的相关输出:

ALTER TABLE [dbo].[Bins] ADD [Code] [nvarchar](max)
UPDATE Bins SET Bins.Code = BinCode WHERE BinCode IS NOT NULL
DECLARE @var0 nvarchar(128)
SELECT @var0 = name
FROM sys.default_constraints
WHERE parent_object_id = object_id(N'dbo.Bins')
AND col_name(parent_object_id, parent_column_id) = 'BinCode';
IF @var0 IS NOT NULL
EXECUTE('ALTER TABLE [dbo].[Bins] DROP CONSTRAINT [' + @var0 + ']')
ALTER TABLE [dbo].[Bins] DROP COLUMN [BinCode]

当我在我的数据库上以完整脚本的形式从 verbose 运行此输出时,我收到错误“无效的列名‘代码’”。但正如我所期望的那样,每个语句依次更新我的数据库。

这是否意味着我需要在多次迁移中执行这种类型的数据转置,或者是否有办法让迁移知道它必须单独执行迁移中的每个步骤?

最佳答案

尝试:

Sql("UPDATE Bins SET Code = BinCode WHERE BinCode IS NOT NULL", true);

我怀疑该语句可能是在删除代码列之后或创建之前执行的。这确保它在用于迁移的事务之外执行。

关于c# - Entity Framework 迁移自定义 SQL 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34794754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com