c# - 如何在不使用原始 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 查询。