Passare un valore NULL a DateTime campo in LINQ
-
13-10-2019 - |
Domanda
La mia tabella di database è come questo
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
Sto usando LINQ to SQL. In C # ho bisogno di passare solo [Importo] e [Commento] campi e altri campi devono essere utilizzati con i loro valori di default ([PropID] e [UpdatedOn]).
In C # creo tbl_CurrentProperties oggetto come il seguente,
tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";
e poi inviare l'oggetto al contesto dei dati. Ma qui, Linq assegnato '1/1/0001 12:00:00 AM'
per il campo UpdatedOn. Ma questo viola la gamma 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
SQL datetime e si verificano un'eccezione. Inoltre non posso assegnare un valore NULL manualmente per un campo DateTime
poiché non è un tipo nullable. Comunque ho bisogno di fare questo per utilizzare il suo DI DEFAULT Constraint. Come posso fare questo?
PS: voglio usare in questo modo perché, mio ??database è in linea e gli utenti si trovano in luoghi diversi. Quindi, se ho usato DateTime.Now, il tempo nella macchina dell'utente può essere sbagliato, e che inserisca un valore errato nel DB. Ho bisogno di usare il tempo del server SQL sempre.
Soluzione
di Andrey risposta è in parte ragione. Ho appena provato questo ed ecco cosa ho trovato.
Nel vostro progettista dbml, sulla vostra colonna UpdatedOn
impostare la seguente:
Auto Generated Value = True
Nullable = False
Poi, su un INSERT
se si utilizza SQL Server Profiler a guardare il codice SQL generato, vedrai che UpdatedOn
è non è incluso nel INSERT . Nemmeno un valore nullo. Questo è importante: per SQL Server per utilizzare un valore predefinito per che Colum, la colonna deve essere omesso dal INSERT
. Se si Nullable = True
set al UpdatedOn
, LINQ to SQL potrebbe essere compresa la colonna a INSERT
con un valore nullo.
Cordiali saluti, subito dopo il INSERT
ci dovrebbe essere un SELECT
dove LINQ to SQL sta recuperando il valore generato automaticamente, così il vostro oggetto entità ha il valore più recente.
Altri suggerimenti
Aprire il dbml e accendere "Auto generata Valore" = true per i campi che sono generati automaticamente. Si dovrebbe essere tutti buoni con passare i null in
mi raccomando si apre il file utilizzando DBML
XML Editor
e di cambiamento che il tipo di colonna dalla DateTime
a DateTime?
consentendo valori null. Salva e il codice verrà generato per voi.
Ogni volta LINQ to SQL
genera DBML
sbagliato, è meglio modificare da soli.