Übergeben Sie einen Nullwert an DateTime -Feld in linq
-
13-10-2019 - |
Frage
Meine Datenbanktabelle ist so
CREATE TABLE MYBUDGET.tbl_CurrentProperty
(
[PropID] INT NOT NULL IDENTITY(1,1),
[UpdatedOn] DATETIME NOT NULL,
[Amount] MONEY NOT NULL,
[Remarks] VARCHAR(100) NOT NULL,
)
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT PK_CurrentProperty_PropID PRIMARY KEY ([PropID])
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT DF_CurrentProperty_UpdatedOn DEFAULT (DATEADD(MINUTE,30,DATEADD(HOUR, 5, GETUTCDATE()))) FOR [UpdatedOn]
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT CK_CurrentProperty_Amount CHECK([Amount] > -1)
GO
Ich benutze Linq nach SQL. In C# muss ich nur [Betrag] und [Bemerkungen] Felder und andere Felder übergeben, mit ihren Standardwerten ([Propid] und [aktualisiert]).
In C# erstelle ich TBL_CurrentProperties -Objekt wie unten, wie unten,
tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";
und senden Sie dann das Objekt in den Datenkontext. Aber hier hat Linq zugewiesen '1/1/0001 12:00:00 AM'
für aktualisiertes Feld. Dies verletzt jedoch den SQL DateTime -Bereich 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
und eine Ausnahme auftreten. Ich kann auch keinen Nullwert manuell für a zuweisen DateTime
Feld, da es ein nicht nullierbarer Typ ist. Wie auch immer, ich muss dies machen, um seine Standardbeschränkung zu verwenden. Wie mache ich das?
PS: Ich möchte es so verwenden, weil meine Datenbank online ist und Benutzer an verschiedenen Orten sind. Wenn ich also datetime.now verwendet habe, ist die Zeit in der Benutzermaschine möglicherweise falsch und fügt einen falschen Wert in DB ein. Ich muss immer die SQL Server -Zeit verwenden.
Lösung
Andrey's Antworten ist teilweise richtig. Ich habe das gerade getestet und hier ist, was ich gefunden habe.
In Ihrem DBML -Designer auf Ihrem UpdatedOn
Die Spalte setzen Folgendes:
Auto Generated Value = True
Nullable = False
Dann auf einem INSERT
wenn du benutzt SQL Server -Profiler Um das generierte SQL zu betrachten, werden Sie das sehen UpdatedOn
ist Nicht im Einsatz enthalten. Nicht einmal ein Nullwert. Dies ist wichtig: Damit SQL Server einen Standardwert für dieses Kolum verwenden kann, ist die Spalte muss weggelassen werden von dem INSERT
. Wenn Sie einstellen Nullable = True
auf der UpdatedOn
, Linq zu SQL könnte die Spalte in die enthalten INSERT
mit einem Nullwert.
Zu Ihrer Information, unmittelbar danach INSERT
Es sollte eine geben SELECT
wobei LINQ zu SQL den automatisch generierten Wert abgerufen, sodass Ihr Entitätsobjekt den neuesten Wert hat.
Andere Tipps
Öffnen Sie Ihre DBML und aktivieren Sie "automatisch generierten Wert" = true für die automatischen Felder. Sie sollten alle gut sein, wenn Sie Nulls eingeben
Ich empfehle Ihnen, Ihre zu öffnen DBML
Datei mit XML Editor
und ändern Sie den Typ dieser Spalte von DateTime
zu DateTime?
Indem Nulls zuzulassen. Speichern Sie es und der Code wird für Sie generiert.
Wann immer LINQ to SQL
erzeugt falsch DBML
, Es ist besser, es selbst zu bearbeiten.