如何使此列与数据库中的PERSISTED COMPUTED列类似?
我当前的尝试(它在种子中加载所有带有null的CompCol行):
public class Call { public Call() { } [Key] public int Id { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public string CompCol { get { return "ABC-" + Convert.ToString(Id).PadLeft(5,'0'); } protected set {} } }
解决方法
我找到的解决方案是:
>确保已关闭自动迁移.这样VS就会生成一个脚本(流畅的api代码)供我们进一步定制而不是仅运行它.所以在配置类中:
public Configuration() { AutomaticMigrationsEnabled = false; }
>将该字段添加到类并将其设置为计算如此,setter是私有的,因为我们显然无法写入计算字段:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] public string BreakdownNo { get; private set; }
>然后在程序包管理器控制台中执行add-migration [xyz-name]以生成迁移代码,该代码将显示在具有给定名称的迁移文件夹下.
>在迁移内注释掉Up()中的代码并添加自定义sql,如下所示:
public override void Up() { //AddColumn("dbo.Calls","BreakdownNo",c => c.String()); sql("ALTER TABLE dbo.Calls ADD BreakdownNo AS ('BD'+RIGHT('00000'+ CAST(Id AS VARCHAR),6))"); }
进一步说明:如果你得到错误的公式,那么你将不得不通过执行update-database -targetMigration来恢复迁移:[迁移的名称返回]然后执行另一个添加迁移名称并在那里修改你的公式,完成关闭update-database.可能有更好的方法,但这是我发现和使用的方式.
然而,我没有找到让这个领域持续存在的方法.