首页 > 解决方案 > 如何在不使用原始 SQL 的情况下使用实体框架根据其先前的值将值设置为更改的列?

问题描述

我有以下情况:

我需要将列的类型从bool更改为enum

由此:

 public class Project : BaseEntity
 {
     public bool IsAccountManagerIncludedAsApprover { get; set; }
 }

对此:

public class Project : BaseEntity
{
    public AccountManagerUserRequestOptions AccountManagerUserRequestOption { get; set; }
}

枚举 AccountManagerUserRequestOptions 如下:

public enum AccountManagerUserRequestOptions
{
    ProcessUserRequest,
    OnlyNotifyForUserRequests,
    DoNothing
}

我需要做的是在值为 true 的地方(当列是 type 时bool)设置AccountManagerUserRequestOptions.ProcessUserRequest

我找到了一种通过显式迁移来做到这一点的方法,如下所示:

public partial class Change_IsAccountManagerIncludedAsApprover_InProjectEntity : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Projects", "AccountManagerUserRequestOption", c => c.Int(nullable: false));

        Sql(@"UPDATE dbo.Projects SET AccountManagerUserRequestOption = 0 WHERE IsAccountManagerIncludedAsApprover = 1");
        Sql(@"UPDATE dbo.Projects SET AccountManagerUserRequestOption = 2 WHERE IsAccountManagerIncludedAsApprover = 0");
        DropColumn("dbo.Projects", "IsAccountManagerIncludedAsApprover");
    }

    public override void Down()
    {
        AddColumn("dbo.Projects", "IsAccountManagerIncludedAsApprover", c => c.Boolean(nullable: false));
        Sql(@"UPDATE dbo.Projects SET IsAccountManagerIncludedAsApprover = 1 WHERE AccountManagerUserRequestOption = 0");
        Sql(@"UPDATE dbo.Projects SET IsAccountManagerIncludedAsApprover = 0 WHERE AccountManagerUserRequestOption = 2");
        DropColumn("dbo.Projects", "AccountManagerUserRequestOption");
    }
}

这里的问题是我想避免原始 SQL 查询

Sql(@"UPDATE dbo.Projects SET IsAccountManagerIncludedAsApprover = 1 WHERE AccountManagerUserRequestOption = 0");
Sql(@"UPDATE dbo.Projects SET IsAccountManagerIncludedAsApprover = 0 WHERE AccountManagerUserRequestOption = 2");

Sql(@"UPDATE dbo.Projects SET AccountManagerUserRequestOption = 0 WHERE IsAccountManagerIncludedAsApprover = 1");
Sql(@"UPDATE dbo.Projects SET AccountManagerUserRequestOption = 2 WHERE IsAccountManagerIncludedAsApprover = 0");

有没有办法在不使用原始 SQL 的情况下进行这种数据迁移?

我问这个的原因是因为我们正在迁移到 PostgreSQL 并且想要避免原始 SQL 查询。

标签: c#sqlasp.net-mvcentity-frameworkentity-framework-migrations

解决方案


推荐阅读