6

Jak ustawić tę kolumnę jako podobną do kolumny PERSISTED COMPUTED w bazie danych?Jak w pierwszej kolejności wykonać kolumnę trwałego obliczania w kodzie EF?

Moja obecna próba (ładuje wszystkie wiersze CompCol z zerową w nasieniu):

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

To wydaje się być pytanie o „kolumny obliczane” zamiast „utrzymywały kolumny obliczane”. Nieprzerwane kolumny obliczeniowe to już inna kwestia. –

Odpowiedz

7

Rozwiązanie znalazłem było:

  1. Upewnij migracje auto są wyłączone. Jest tak, aby VS wygenerował skrypt (płynny kod api), abyśmy mogli dalej go dostosowywać, zamiast tylko go uruchamiać. Więc w klasie konfiguracji:

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = false; 
    } 
    
  2. Dodaj pole do klasy i ustawić go jako obliczane jak tak, to seter jest prywatny, ponieważ oczywiście nie można napisać do pola wyliczona:

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public string BreakdownNo { get; private set; } 
    
  3. Następnie wykonaj add-migration [xyz-name] w Konsoli menedżera pakietów, aby wygenerować kod migracji, który pojawi się w folderze migracji o podanej nazwie.

  4. Wewnątrz komentarzu migracji na zewnątrz kodu w Up() i dodać niestandardowy SQL tak:

    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. Czy to update-database w PM i należy dodać kolumnę obliczoną prawidłowo.

zauważa ponadto: Jeśli masz złą formułę wtedy trzeba będzie powrócić migracji wykonując update-database -targetMigration: [name of migration to go back to] następnie zrobić kolejny add-migration name i zmienia swoją formułę tam, wykończenia z update-bazy. Może być lepszy sposób, ale to jest to, co znalazłem i wykorzystałem.

Nie znalazłem jednak sposobu, aby pole przetrwało.

+5

To dobry przykład na to, jak trudno jest sprawić, by migracje automatyczne działały prawidłowo. –

0

Dlaczego nie wywołanie sql tak:

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)"); 
    } 
}