Как установить значение для измененного столбца на основе его предыдущего значения с Entity Framework без использования raw SQL? - PullRequest
1 голос
/ 24 марта 2020

У меня есть следующий случай:

Мне нужно изменить тип столбца с 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 (когда столбец имеет тип 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");

Есть ли способ выполнить эту миграцию данных без использования raw SQL?

Причина, по которой я спрашиваю это потому что мы переходим на PostgreSQL и хотим избежать необработанных SQL запросов.

...