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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top