Передайте нулевое значение в поле DateTime в LINQ
-
13-10-2019 - |
Вопрос
Моя таблица баз данных такая
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
Я использую LINQ для SQL. В C# мне нужно пройти только [сумма] и [Замечания] Поля и другие поля должны использоваться со значениями по умолчанию ([Propid] и [updatedon]).
В C# я создаю объект TBL_CurrentProperties, как ниже,
tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";
а затем отправьте объект в контекст данных. Но здесь, LINQ назначен '1/1/0001 12:00:00 AM'
для поля обновления. Но это нарушает диапазон SQL DateTime 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
и возникает исключение. Также я не могу присвоить нулевое значение вручную для DateTime
Поле, так как это не нулевой тип. Во всяком случае, мне нужно сделать это, чтобы использовать его ограничение по умолчанию. Как мне это сделать?
PS: Я хочу использовать его так, потому что моя база данных онлайн, а пользователи находятся в разных местах. Так что, если я использовал DateTime.Now, время в пользовательской машине может быть неправильным, и оно вставит неверное значение в DB. Мне нужно всегда использовать время SQL Server.
Решение
Андрей отвечать частично прав. Я только что проверил это, и вот что я нашел.
В вашем дизайнере DBML на вашем UpdatedOn
Столбец установил следующее:
Auto Generated Value = True
Nullable = False
Затем на INSERT
Если вы используете SQL Server Profiler Чтобы посмотреть на сгенерированный SQL, вы увидите, что UpdatedOn
является не включен в вставку. Анкет Даже не нулевое значение. Это важно: для SQL Server использовать значение по умолчанию для этого Colum, столбец должен быть опущен от INSERT
. Анкет Если вы установите Nullable = True
на UpdatedOn
, Linq to sql мощь включать столбец в INSERT
с нулевым значением.
К вашему сведению, сразу после INSERT
должен быть SELECT
где LINQ в SQL получает автоматическое значение, поэтому ваш объект объекта имеет последнее значение.
Другие советы
Откройте свой DBML и включите «Автогенерированное значение» = true для автоматических полей. Вы должны быть хорошими в прохождении нулевых
Я рекомендую вам открыть ваш DBML
Файл с использованием XML Editor
и изменить тип этого столбца с DateTime
к DateTime?
разрешая нулевые. Сохраните его, и код будет сгенерирован для вас.
Когда бы ни LINQ to SQL
генерирует неправильно DBML
, лучше отредактировать это самостоятельно.