Вопрос

Моя таблица баз данных такая

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, лучше отредактировать это самостоятельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top