Passez une valeur NULL à DateTime Field à LINQ
-
13-10-2019 - |
Question
Ma table de base de données est comme ceci
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
J'utilise LINQ to SQL. En C # Je besoin de passer seulement [Montant] et [Remarques] champs et d'autres champs doivent être utilisés avec leurs valeurs par défaut ([PropID] et [UpdatedOn]).
En C # Je crée objet tbl_CurrentProperties comme ci-dessous,
tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";
puis soumettre l'objet au contexte de données. Mais ici, Linq attribué '1/1/0001 12:00:00 AM'
pour le champ UpdatedOn. Mais cela viole la gamme datetime SQL 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
et Survenant une exception. Je ne peux pas attribuer une valeur NULL manuellement pour un champ DateTime
depuis son un non type Nullable. Quoi qu'il en soit, je dois faire ceci pour utiliser sa DEFAULT contrainte. Comment puis-je faire?
PS: Je veux l'utiliser comme ceci parce que, Ma base de données est en ligne et les utilisateurs sont dans des endroits différents. Donc, si je DateTime.Now, le temps dans la machine de l'utilisateur peut se tromper, et insérer une mauvaise valeur dans DB. Je dois utiliser le temps du serveur SQL toujours.
La solution
Andrey de réponse est en partie droite. Je viens de tester cela et voici ce que j'ai trouvé.
Dans votre concepteur dbml, sur votre colonne UpdatedOn
définissez les éléments suivants:
Auto Generated Value = True
Nullable = False
Ensuite, sur un INSERT
si vous utilisez Profiler SQL Server à regarder le SQL généré, vous verrez que UpdatedOn
est pas inclus dans le INSERT . Pas même une valeur nulle. Ceci est important: pour SQL Server à utiliser une valeur par défaut pour cette Colum, la colonne doit être omis de la INSERT
. Si vous définissez Nullable = True
sur la UpdatedOn
, LINQ to SQL peut inclurons la colonne INSERT
avec une valeur nulle.
Pour votre information, immédiatement après la INSERT
il devrait y avoir un SELECT
où LINQ to SQL récupère la valeur générée automatiquement, de sorte que votre objet entité a la dernière valeur.
Autres conseils
Ouvrez votre dbml et allumez « Autogénérés Valeur » = true pour les champs qui sont générés automatiquement. Vous devriez être bon avec passage dans nulls
Je vous recommande d'ouvrir votre fichier en utilisant DBML
XML Editor
et le changement que le type de la colonne de DateTime
à DateTime?
en permettant nulls. Enregistrer et le code sera généré pour vous.
Chaque fois que LINQ to SQL
génère mal DBML
, il est préférable de modifier vous-même.