6

如何將此列與數據庫中的PERSISTED COMPUTED列相似?如何首先在EF代碼中創建持久計算列?

我目前的嘗試(它加載所有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 {} 
     } 
} 
+0

這好像是問關於「計算列」,而不是「持久化計算列」​​。堅持計算的專欄是另一回事。 –

回答

7

我找到的解決方案是:

  1. 確保自動遷移關閉。這樣VS會生成一個腳本(流暢的api代碼),供我們進一步自定義,而不僅僅是運行它。所以在配置類:

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = false; 
    } 
    
  2. 的字段添加到類,並將其設置爲計算像這樣,二傳手是私有的,因爲我們顯然不能寫入計算字段:

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public string BreakdownNo { get; private set; } 
    
  3. 然後在程序包管理器控制檯中執行add-migration [xyz-name]以生成遷移代碼,該代碼將顯示在具有給定名稱的migrations文件夾下。

  4. 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))"); 
    } 
    
  5. 不要在PM的update-database並應適當添加計算列。

還注意到:如果你得到的公式錯誤,那麼你將不得不做一個update-database -targetMigration: [name of migration to go back to]然後再做另一add-migration name和修正公式那裏,更新數據庫整理過,以恢復遷移。可能有更好的方法,但這是我找到和使用的。

但是,我沒有找到一種方法來使該字段仍然存在。

+5

這是一個很好的例子,它讓自動遷移很好地工作是多麼困難。 –

0

這樣爲什麼不叫SQL:

public class demo 
{ 
    void demoMethod() 
    { 
     Model1 model = new Model1();//Model1 : DbContext 
     model.Database.ExecuteSqlCommand("alter table Results drop column Total; alter table Results add Total AS (Arabic + English + Math + Science)"); 
    } 
}