Pasar un valor NULL a DateTime campo en LINQ
-
13-10-2019 - |
Pregunta
Mi tabla de base de datos es como esto
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
Estoy usando LINQ a SQL. En C # I necesidad de pasar solamente [Cantidad] y [Observaciones] campos y otros campos se deben utilizar con sus valores por defecto ([PropID] y [UpdatedOn]).
En C # I crear el objeto tbl_CurrentProperties como a continuación,
tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";
y luego enviar el objeto al contexto de datos. Pero aquí, LINQ asignado '1/1/0001 12:00:00 AM'
para el campo UpdatedOn. Pero esto viola la 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
rango de fecha y hora de SQL y que se produzca una excepción. También no puedo asignar un valor NULL manualmente para un campo DateTime
ya que no es un tipo anulable. De todos modos tengo que hacer esto para usar su valor por defecto de restricción. ¿Cómo puedo hacer esto?
PD: Quiero utilizar de esta manera porque, Mi base de datos está en línea y usuarios están en diferentes ubicaciones. Así que si he usado DateTime.Now, el tiempo en la máquina del usuario puede ser incorrecto, y lo inserta un valor incorrecto en DB. Necesito usar la hora del servidor SQL siempre.
Solución
de Andrey respuesta es parte de razón. Acabo de probar esto y esto es lo que encontré.
En su diseñador dbml, en su columna UpdatedOn
establece lo siguiente:
Auto Generated Value = True
Nullable = False
A continuación, en una INSERT
si usar de SQL Server para mirar el SQL generado, se verá que se UpdatedOn
no incluido en el INSERT . Ni siquiera un valor nulo. Esto es importante: para SQL Server para utilizar un valor predeterminado para que Colum, la columna debe omitirse de la INSERT
. Si se establece en la Nullable = True
UpdatedOn
, LINQ a SQL podría será incluida la columna de la INSERT
con un valor nulo.
Para su información, inmediatamente después de la INSERT
debería haber una SELECT
donde LINQ a SQL está recuperando el valor generado automáticamente, por lo que su objeto de entidad tiene el valor más reciente.
Otros consejos
Abra su dbml y encienda "Auto de creación de valor" = cierto para los campos que son generados automáticamente. Usted debe estar todo bien con el paso de los nulos en
recomiendo abrir su archivo DBML
usando XML Editor
y el cambio de ese tipo de la columna de DateTime
a DateTime?
permitiendo nulos. Guardar y el código se generará para usted.
Siempre que genera LINQ to SQL
DBML
mal, es mejor editar usted mismo.