2015-06-24 12 views
19

Ich verwende EF6 zum Speichern von Instanzen der report Klasse in meiner Datenbank. Die Datenbank enthält bereits Daten. Sagen wir, ich wollte eine Immobilie zu report,Code-First Migration: Wie setze ich den Standardwert für eine neue Eigenschaft?

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

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

Jetzt hinzufügen, wenn ich auf das Paket-Manager-Konsole gehen und

add-migration Report-added-newProperty 
update-database 

ausführen ich Ordner eine Datei in der ‚/ Migrations‘ erhalten Hinzufügen eines newProperty Spalte zum Tisch. Das funktioniert gut. Bei den älteren Einträgen in der Datenbank ist der Wert für newProperty jetzt jedoch eine leere Zeichenfolge. Aber ich möchte, dass es z. B. "alt" ist.

Also meine Frage ist: Wie setze ich Standardwerte für neue Eigenschaften (jeden Typs) im Migrationsskript (oder anderswo)?

Antwort

31

Wenn Sie den generierten Migrationscode sehen Sie AddColumn sehen

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

Sie defaultValue

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

Oder fügen defaultValueSql

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

Wäre schön, wenn es richtig in dem [Default (xyz)] Attribute gezogen, wie in dem Code ersten Modell definiert. Anstatt sich daran erinnern zu müssen, welche Spalten bei jeder Add-Migration-Aktion benötigt werden. Nachbearbeitung der erzeugten Datei, gefolgt von der normalen Ausführung der Update-Datenbank gegen diese geänderte Datei. Ich frage mich, ob es möglich ist, dieses unintelligente Verhalten zu überschreiben .... Ich kann nicht glauben, dass niemand dies verbessert hat. Sicher bin ich nicht der Einzige, der mit dem AspNet Identity-Standardmodell frustriert ist ... LockoutEnabled, EmailConfirmed, AccessFailedCount. Alle hardcoded, alle Probleme – Barry

+1

Dies scheint nicht mit MySQL-EF zu arbeiten. 'defaultValue' setzt den Wert nicht und 'defaultValueSql' erzeugt eine Ausnahme ("Blob-Text-Geometrie oder json-Spalte kann keinen Standardwert haben") ... die einzige verbleibende Lösung ist die Verwendung von Raw SQL. :( – Efrain

3

Sie die Zeile ändern müssen hinzufügen können in Ihr Migrationsskript, das das richtige hinzufügt ty/Spalte wie folgt aus:

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

fand ich, dass nur auf Entitätseigenschaft Auto-Property Initializer mit genug ist, die Arbeit zu erledigen.

Zum Beispiel:

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

Was ist los damit? –

Verwandte Themen