2011-01-20 28 views
5

Mi tabla de base de datos es asípasar un valor NULL a DateTime campo en LINQ

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#, necesito pasar solo campos [Cantidad] y [Comentarios] y otros campos deben usarse con sus valores predeterminados ([PropID] y [UpdatedOn]).

En C# que crean tbl_CurrentProperties objeto, 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 asignó '1/1/0001 12:00:00 AM' para el campo UpdatedOn. Pero esto viola el intervalo de fecha y hora de SQL 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM y Ocurre una excepción. Además, no puedo asignar un valor NULL manualmente para un campo DateTime ya que es un tipo que no admite nulos. De todos modos, necesito hacer esto para usar su Restricción POR DEFECTO. ¿Cómo hago esto?


PD: Quiero usarlo así porque, Mi base de datos está en línea y los usuarios se encuentran en diferentes ubicaciones. Entonces, si usé DateTime.Now, la hora en la máquina del usuario puede ser incorrecta e Inserta un valor incorrecto en DB. Necesito usar el tiempo del servidor SQL siempre.

+3

Por supuesto, si movió su lógica de negocio de su base de datos a su código, entonces no tendría este problema :-) –

+0

algunas cosas como la fecha creada son mucho mejor tener en el db – Andrey

+1

@Andrey: Mucha gente estaría totalmente en desacuerdo contigo. Tal vez esto fue aceptable hace 10 años, pero ahora toda la lógica comercial debería estar centralizada en el código. –

Respuesta

7

Andrey'sanswer es parcialmente correcto. Acabo de probar esto y esto es lo que encontré.

En su diseñador dbml, en su columna de UpdatedOn establece lo siguiente:

Auto Generated Value = True 
Nullable = False 

Luego, en una INSERT si utiliza SQL Server Profiler mirar el SQL generado, se verá que se UpdatedOnno incluido en el INSERT. Ni siquiera un valor nulo. Esto es importante: para que SQL Server use un valor predeterminado para esa columna, se debe omitir la columna del INSERT. Si configura Nullable = True en el UpdatedOn, LINQ to SQL podría incluir la columna en el INSERT con un valor nulo.

FYI, inmediatamente después de INSERT debe haber un SELECT donde LINQ to SQL está recuperando el valor generado automáticamente, por lo que su objeto entidad tiene el último valor.

2

recomiendo abrir su archivo DBML usando XML Editor y cambiar el tipo de esa columna DateTime-DateTime? permitiendo nulos. Guárdalo y el código se generará para ti.

Siempre que LINQ to SQL genere el error DBML, es mejor editarlo usted mismo.

+0

el dbml genera el xml incorrecto porque configuró las configuraciones incorrectamente. Ver mi respuesta – Andrey

+3

Gracias por la respuesta. pero establecer este valor en NULL no funcionó. Como Shaunmartin y Andrey mencionaron que dar vuelta "Auto Generated Value = true" es lo correcto. De todos modos, gracias por ayudarme. :) – Sency

3

Abra su dbml y encienda "Valor autogenerado" = verdadero para los campos que se generan automáticamente. Debería estar bien con pasar nulos en

+0

Gracias Andrey.Está pasando un valor NULO. Pero dado que este campo NO es NULO, este error está ocurriendo. "No se puede insertar el valor NULL en la columna 'UpdatedOn', la columna 'myDataContext.tbl_CurrentProperty'; la columna no permite nulos. INSERT falla. La declaración ha finalizado." – Sency

+0

Esto parece un problema de diseño. Su db debería estar reviviendo un valor para establecer el campo, generar automáticamente el valor (en cuyo caso mi solución funcionaría), o permitir que el campo sea nulo. No debe usar algo así como una fecha mínima para representar un nulo. Si por algún motivo necesita el tiempo de fecha mínimo de sql en su código, puede obtenerlo como System.Data.SqlTypes.SqlDateTime.MinValue() – Andrey

+3

@Kushan: Esta respuesta es correcta. Como ha señalado Shaunmartin, no funcionará si se combina con la respuesta de deciclón. Necesita configurar la columna para que no sea nulable y para 'DateTime' (no' DateTime? ') Y luego establecer' Auto Generated = True' como sugirió Andrey. –

Cuestiones relacionadas