Weiß jemand, wie ich den Standardwert für eine DateTime-Eigenschaft mithilfe des System.ComponentModel DefaultValue-Attributs angeben kann?
Zum Beispiel versuche ich Folgendes:
[DefaultValue(typeof(DateTime),DateTime.Now.ToString("yyyy-MM-dd"))]
public DateTime DateCreated { get; set; }
Und es wird erwartet, dass der Wert ein konstanter Ausdruck ist.
Dies steht im Zusammenhang mit der Verwendung mit dynamischen ASP.NET-Daten. Ich möchte die DateCreated-Spalte nicht als Gerüst verwenden, sondern nur die DateTime.Now angeben, wenn sie nicht vorhanden ist. Ich verwende das Entity Framework als meine Datenschicht
Prost,
Andrew
quelle
get
Teil kann vereinfacht werden, um:return dateCreated ?? DateTime.Now;
Fügen Sie unten die DateTime-Eigenschaft hinzu
quelle
Es gibt keinen Grund, warum ich mir vorstellen kann, dass es nicht möglich sein sollte, ein Attribut zu verwenden. Möglicherweise befindet es sich im Rückstand von Microsoft. Wer weiß.
Die beste Lösung, die ich gefunden habe, besteht darin, den Parameter defaultValueSql in der ersten Code-Migration zu verwenden.
Ich mag die häufig verwendete Referenzlösung zum Festlegen im Entitätsklassenkonstruktor nicht, da das Datumsfeld keinen Standardwert erhält, wenn etwas anderes als Entity Framework einen Datensatz in diese Tabelle einfügt. Und die Idee, einen Auslöser zu verwenden, um diesen Fall zu behandeln, scheint mir einfach falsch.
quelle
Ich habe dies auf EF Core 2.1 getestet
Hier können Sie weder Konventionen noch Datenanmerkungen verwenden. Sie müssen die Fluent-API verwenden .
Offizielles Dokument
quelle
Es ist möglich und ganz einfach:
zum
DateTime.MinValue
für jeden anderen Wert als letztes Argument der
DefaultValueAttribute
angegebenen Zeichenfolge, die den gewünschten DateTime-Wert darstellt.Dieser Wert muss ein konstanter Ausdruck sein und ist erforderlich, um object (
DateTime
) mit zu erstellenTypeConverter
.quelle
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)
Eine einfache Lösung, wenn Sie das Entity Framework verwenden, besteht darin, eine partielle Klasse hinzuzufügen und einen Konstruktor für die Entität zu definieren, da das Framework keine definiert. Wenn Sie beispielsweise eine Entität mit dem Namen "Beispiel" haben, fügen Sie den folgenden Code in eine separate Datei ein.
quelle
Ich denke, die einfachste Lösung ist das Einstellen
Legen Sie in der Spaltendeklaration und im VS2010 EntityModel-Designer die entsprechende Spalteneigenschaft StoreGeneratedPattern = Computed fest .
quelle
Das Erstellen einer neuen Attributklasse ist ein guter Vorschlag. In meinem Fall wollte ich 'default (DateTime)' oder 'DateTime.MinValue' angeben, damit der Newtonsoft.Json-Serializer DateTime-Mitglieder ohne echte Werte ignoriert.
Ohne das DefaultValue-Attribut würde der JSON-Serializer "1/1/0001 12:00:00 AM" ausgeben, obwohl die Option DefaultValueHandling.Ignore festgelegt wurde.
quelle
Stellen Sie den Wert einfach im Konstruktor Ihrer Entitätsklasse ein
quelle
Datetime
Eigenschaft auf null setzen musste.Ich brauchte einen UTC-Zeitstempel als Standardwert und modifizierte Daniels Lösung wie folgt:
Das DateRangeAttribute-Tutorial finden Sie in diesem fantastischen Blog-Beitrag
quelle
using System.ComponentModel.DataAnnotations.Schema;
quelle
Da ist ein Weg. Fügen Sie diese Klassen hinzu:
DefaultDateTimeValueAttribute.cs
DefaultDateTimeExtensions.cs
Verwenden Sie DefaultDateTimeValue als Attribut für Ihre Eigenschaften. Der Wert, der in Ihr Validierungsattribut eingegeben werden muss, ist "Jetzt", der zur Laufzeit von einer mit einem Aktivator erstellten DateTime-Instanz gerendert wird. Der Quellcode ist von diesem Thread inspiriert: https://code.msdn.microsoft.com/A-flexible-Default-Value-11c2db19 . Ich habe es geändert, damit meine Klasse mit DefaultValueAttribute anstelle eines ValidationAttribute erbt.
quelle
Ich hatte das gleiche Problem, aber das, das für mich am besten funktioniert, ist unten aufgeführt:
quelle
Ich habe gerade festgestellt, dass dies nach etwas anderem sucht, aber in der neuen C # -Version können Sie dafür eine noch kürzere Version verwenden:
quelle
quelle
Wie Sie derzeit damit umgehen, hängt davon ab, welches Modell Sie mit Linq to SQL oder EntityFramework verwenden.
In L2S können Sie hinzufügen
EF ist etwas komplizierter. Weitere Informationen zur EF-Geschäftslogik finden Sie unter http://msdn.microsoft.com/en-us/library/cc716714.aspx .
quelle
Ich weiß, dass dieser Beitrag ein wenig alt ist, aber ich habe einen Vorschlag, der einigen helfen kann.
Ich habe eine Aufzählung verwendet, um zu bestimmen, was im Attributkonstruktor festgelegt werden soll.
Eigentumserklärung:
Eigenschaftskonstruktor:
Aufzählung:
quelle
Ich denke, Sie können dies mit
StoreGeneratedPattern = Identity
(im Eigenschaftenfenster des Modelldesigners festgelegt) tun .Ich hätte nicht gedacht, dass dies so sein würde, aber als ich versuchte, es herauszufinden, bemerkte ich, dass einige meiner Datumsspalten bereits standardmäßig verwendet wurden
CURRENT_TIMESTAMP()
und andere nicht. Wenn ich das Modell überprüfe, sehe ich, dass der einzige Unterschied zwischen den beiden Spalten neben dem Namen darin besteht, dass diejenige, die den Standardwert erhält, aufStoreGeneratedPattern
gesetzt wurdeIdentity
.Ich hätte nicht erwartet, dass das so ist, aber das Lesen der Beschreibung macht irgendwie Sinn:
Auch wenn die Datenbankspalte dadurch den Standardwert "jetzt" hat, wird die Eigenschaft
DateTime.Now
vermutlich nicht so festgelegt, dass sie sich im POCO befindet. Dies war für mich kein Problem, da ich eine angepasste .tt-Datei habe, in der bereits alle meine DatumsspaltenDateTime.Now
automatisch festgelegt sind (es ist eigentlich nicht schwer, die .tt-Datei selbst zu ändern, insbesondere wenn Sie über ReSharper verfügen und eine Syntaxhervorhebung erhalten Plugin. (Neuere Versionen von VS können bereits .tt-Dateien syntaktisch hervorheben, nicht sicher.))Das Problem für mich war: Wie kann ich erreichen, dass die Datenbankspalte einen Standardwert hat, sodass vorhandene Abfragen, bei denen diese Spalte weggelassen wird, weiterhin funktionieren? Und die obige Einstellung hat dafür funktioniert.
Ich habe es noch nicht getestet, aber es ist auch möglich, dass das Einstellen dies die Einstellung Ihres eigenen expliziten Werts beeinträchtigt. (Ich bin erst darauf gestoßen, weil EF6 Database First das Modell auf diese Weise für mich geschrieben hat.)
quelle
In C # Version 6 ist es möglich, einen Standardwert anzugeben
quelle
Mit EF 7:
Migrationsskript:
Ergebnis:
quelle
Ich wollte das auch und habe mir diese Lösung ausgedacht (ich verwende nur den Datumsteil - eine Standardzeit macht als PropertyGrid-Standard keinen Sinn):
Dadurch wird lediglich ein neues Attribut erstellt, das Sie Ihrer DateTime-Eigenschaft hinzufügen können. Beispiel: Wenn der Standardwert DateTime.Now.Date ist:
quelle