2015-06-24 12 views
19

Używam EF6 do przechowywania wystąpień klasy report w mojej bazie danych. Baza danych zawiera już dane. Powiedzieć chciałem dodać obiekt do report,Pierwsza migracja po kodzie: jak ustawić domyślną wartość dla nowej właściwości?

public class report { 
    // ... some previous properties 

    // ... new property: 
    public string newProperty{ get; set; } 
} 

Teraz jeśli pójdę do konsoli pakiet kierownika i wykonać

add-migration Report-added-newProperty 
update-database 

dostanę plik w folderze „/ migracje” dodanie newProperty kolumna do stołu. To działa dobrze. Jednak w starszych wpisach w bazie danych wartość dla newProperty jest teraz pustym ciągiem. Ale chcę, żeby to było, na przykład, "stare".

Moje pytanie brzmi: Jak ustawić domyślne wartości dla nowych właściwości (dowolnego typu) w skrypcie migracji (lub w innym miejscu)?

Odpowiedz

31

Jeśli pojawi się wygenerowany kod migracji widać AddColumn

AddColumn("dbo.report", "newProperty", c => c.String(nullable: false)); 

Możesz dodać defaultValue

AddColumn("dbo.report", "newProperty", 
      c => c.String(nullable: false, defaultValue: "old")); 

Albo dodać defaultValueSql

AddColumn("dbo.report", "newProperty", 
      c => c.String(nullable: false, defaultValueSql: "GETDATE()")); 
+4

Byłoby miło, gdyby to właściwie pociągnął w [DefaultValue (xyz)] atrybutu zdefiniowane w kodzie pierwszego modelu. Zamiast konieczności pamiętania, które kolumny potrzebują, za każdym razem, gdy dodajemy Migration; konieczności edycji po edycji wygenerowanego pliku, a następnie normalnego działania bazy danych aktualizacji w stosunku do tego zmienionego pliku. Zastanawiam się, czy można zastąpić to nieinteligentne zachowanie ... Nie mogę uwierzyć, że nikt nie poprawił tego. Z pewnością nie jestem jedynym, który jest sfrustrowany tym z domyślnym modelem AspNet Identity ... LockoutEnabled, EmailConfirmed, AccessFailedCount. wszystkie na stałe, wszystkie problemy – Barry

+1

To nie działa z MySQL-EF. "defaultValue" nie ustawia wartości, a "defaultValueSql" tworzy wyjątek ("geometria tekstu blobowego lub kolumna json nie może mieć wartości domyślnej") ... jedynym rozwiązaniem jest użycie surowego SQL. :( – Efrain

3

Musisz zmienić linię twój skrypt migracji, który dodaje właściwe ty/kolumna w następujący sposób:

AddColumn("dbo.reports", "newProperty", c => c.String(nullable: false, defaultValue: "test")); 
-5

Znalazłem, że wystarczy za pomocą Auto-Property Initializer na właściwość obiektu wystarczy, aby wykonać zadanie.

Na przykład:

public class Thing { 
    public bool IsBigThing { get; set; } = false; 
} 
+0

Co jest z tym nie tak? –

Powiązane problemy