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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top