Gibt es eine "elegante" Möglichkeit, einer bestimmten Eigenschaft einen Standardwert zu geben?
Vielleicht von DataAnnotations, so etwas wie:
[DefaultValue("true")]
public bool Active { get; set; }
Danke dir.
entity-framework
ef-code-first
default-value
marino-krk
quelle
quelle
this.Active = true;
? Ich denke, der DB-Wert hat beim Abrufen Vorrang, aber seien Sie vorsichtig, wenn Sie neu sind, und fügen Sie dann zuerst eine Entität für ein Update ohne Abruf hinzu, da die Änderungsverfolgung dies möglicherweise sieht, wenn Sie den Wert aktualisieren möchten. Kommentar, weil ich EF schon lange nicht mehr verwendet habe und ich denke, dass dies ein Schuss in die Dunkelheit ist.public bool Inactive { get; set; }
😉Antworten:
Sie können dies tun, indem Sie die erste Migration des Codes manuell bearbeiten:
quelle
Active
auf ,true
wenn eine der ErstellungEvent
als auch Objekt. Der Standardwert befindet sich immer infalse
einer nicht nullbaren Bool-Eigenschaft. Sofern nicht geändert, wird das Entity-Framework in der Datenbank gespeichert. Oder fehlt mir etwas?Es ist eine Weile her, aber eine Notiz für andere hinterlassen. Ich habe mit einem Attribut erreicht, was benötigt wird, und meine Modellklassenfelder mit diesem Attribut nach Belieben dekoriert.
Habe die Hilfe dieser 2 Artikel bekommen:
Was ich getan habe:
Attribut definieren
Im "OnModelCreating" des Kontexts
Im benutzerdefinierten SqlGenerator
Registrieren Sie dann im Konstruktor für die Migrationskonfiguration den benutzerdefinierten SQL-Generator.
quelle
[SqlDefaultValue(DefaultValue = "getutcdate()")]
jede Entität anzulegen. 1) Einfach entfernenmodelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));
2) HinzufügenmodelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
Die obigen Antworten haben wirklich geholfen, aber nur einen Teil der Lösung geliefert. Das Hauptproblem besteht darin, dass die Einschränkung für die Spalte in der Datenbank nicht entfernt wird, sobald Sie das Standardwertattribut entfernen. Der vorherige Standardwert bleibt also weiterhin in der Datenbank.
Hier finden Sie eine vollständige Lösung des Problems, einschließlich des Entfernens von SQL-Einschränkungen beim Entfernen von Attributen. Ich verwende auch das native
DefaultValue
Attribut von .NET Framework erneut .Verwendung
Damit dies funktioniert, müssen Sie die Dateien IdentityModels.cs und Configuration.cs aktualisieren
Datei IdentityModels.cs
Fügen Sie diese Methode in Ihrer
ApplicationDbContext
Klasse hinzu / aktualisieren Sie sieDatei Configuration.cs
Aktualisieren Sie Ihren
Configuration
Klassenkonstruktor, indem Sie einen benutzerdefinierten SQL-Generator wie folgt registrieren:Fügen Sie als Nächstes eine benutzerdefinierte SQL-Generatorklasse hinzu (Sie können sie der Datei Configuration.cs oder einer separaten Datei hinzufügen ).
quelle
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Attribut festlegen ? Wenn ja warum? In meinen Tests schien es keine Wirkung zu haben, es wegzulassen.Ihre Modelleigenschaften müssen keine "automatischen Eigenschaften" sein, auch wenn dies einfacher ist. Und das DefaultValue-Attribut besteht eigentlich nur aus informativen Metadaten. Die hier akzeptierte Antwort ist eine Alternative zum Konstruktoransatz.
vs.
Dies funktioniert nur für Anwendungen, die Daten mit dieser bestimmten Klasse erstellen und verarbeiten. Normalerweise ist dies kein Problem, wenn der Datenzugriffscode zentralisiert ist. Um den Wert für alle Anwendungen zu aktualisieren , müssen Sie die Datenquelle so konfigurieren, dass ein Standardwert festgelegt wird. Die Antwort von Devi zeigt, wie dies mithilfe von Migrationen, SQL oder einer anderen Sprache, die Ihre Datenquelle spricht, durchgeführt werden kann.
quelle
Was ich getan habe, habe ich Werte im Konstruktor der Entität initialisiert
Hinweis: DefaultValue-Attribute legen die Werte Ihrer Eigenschaften nicht automatisch fest, sondern müssen selbst ausgeführt werden
quelle
Nach dem Kommentar von @SedatKapanoglu füge ich meinen gesamten Ansatz hinzu, der funktioniert, da er Recht hatte. Nur die Verwendung der fließenden API funktioniert nicht.
1- Erstellen Sie einen benutzerdefinierten Codegenerator und überschreiben Sie Generieren für ein ColumnModel.
2- Weisen Sie den neuen Codegenerator zu:
3- Verwenden Sie eine fließende API, um die Anmerkung zu erstellen:
quelle
Es ist einfach! Einfach mit erforderlich kommentieren.
Die resultierende Migration wird sein:
Wenn Sie true möchten, ändern Sie den Standardwert bei der Migration in true, bevor Sie die Datenbank aktualisieren
quelle
true
?Ich gebe zu, dass mein Ansatz dem gesamten "Code First" -Konzept entgeht. Aber wenn Sie die Möglichkeit haben, nur den Standardwert in der Tabelle selbst zu ändern ... ist es viel einfacher als die Längen, die Sie oben durchlaufen müssen ... Ich bin einfach zu faul, um all diese Arbeit zu erledigen!
Es scheint fast so, als würde die ursprüngliche Idee des Plakats funktionieren:
Ich dachte, sie hätten nur den Fehler gemacht, Zitate hinzuzufügen ... aber leider keine solche Intuitivität. Die anderen Vorschläge waren einfach zu viel für mich (vorausgesetzt, ich habe die erforderlichen Berechtigungen, um in die Tabelle zu gehen und die Änderungen vorzunehmen ... wo nicht jeder Entwickler in jeder Situation wird). Am Ende habe ich es einfach auf die altmodische Weise gemacht. Ich habe den Standardwert in der SQL Server-Tabelle festgelegt ... ich meine wirklich schon genug! HINWEIS: Ich habe die Durchführung einer Add-Migration- und Update-Datenbank weiter getestet und die Änderungen stecken geblieben.
quelle
Überladen Sie einfach den Standardkonstruktor der Modellklasse und übergeben Sie alle relevanten Parameter, die Sie möglicherweise verwenden oder nicht. Auf diese Weise können Sie problemlos Standardwerte für Attribute angeben. Unten ist ein Beispiel.
quelle
Nehmen wir an, Sie haben einen Klassennamen mit dem Namen Products und ein IsActive-Feld. Sie benötigen lediglich einen Konstruktor zum Erstellen:
Dann ist Ihr IsActive-Standardwert True!
Bearbeiten :
Wenn Sie dies mit SQL tun möchten, verwenden Sie diesen Befehl:
quelle
In EF Core, das am 27. Juni 2016 veröffentlicht wurde, können Sie die fließende API zum Festlegen des Standardwerts verwenden. Wechseln Sie zur ApplicationDbContext-Klasse, suchen / erstellen Sie den Methodennamen OnModelCreating und fügen Sie die folgende fließende API hinzu.
quelle
In .NET Core 3.1 können Sie in der Modellklasse Folgendes ausführen:
In DbContext OnModelCreating fügen Sie den Standardwert hinzu.
Daraus ergibt sich Folgendes in der Datenbank
Hinweis: Wenn Sie für Ihre Eigenschaft keine Nullable (bool?) Haben, wird die folgende Warnung angezeigt
quelle
Ich habe festgestellt, dass es ausreicht, nur den Auto-Property Initializer für die Entitätseigenschaft zu verwenden, um die Aufgabe zu erledigen.
Beispielsweise:
quelle
Hmm ... ich mache zuerst DB und in diesem Fall ist das tatsächlich viel einfacher. EF6 richtig? Öffnen Sie einfach Ihr Modell, klicken Sie mit der rechten Maustaste auf die Spalte, für die Sie einen Standard festlegen möchten, wählen Sie Eigenschaften aus und Sie sehen ein Feld "DefaultValue". Füllen Sie das einfach aus und speichern Sie es. Es wird den Code für Sie einrichten.
Ihr Kilometerstand kann jedoch je nach Code variieren. Damit habe ich noch nicht gearbeitet.
Das Problem bei vielen anderen Lösungen besteht darin, dass sie zwar anfänglich funktionieren, aber sobald Sie das Modell neu erstellen, den von Ihnen in die maschinengenerierte Datei eingefügten benutzerdefinierten Code ausgeben.
Diese Methode fügt der edmx-Datei eine zusätzliche Eigenschaft hinzu:
Und indem Sie dem Konstruktor den erforderlichen Code hinzufügen:
quelle
Legen Sie den Standardwert für die Spalte in der Tabelle in MSSQL Server und im Klassencode-Attribut add wie folgt fest:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
für die gleiche Eigenschaft.
quelle