Sen*_*ncy 5 c# sql datetime linq-to-sql default-constraint
我的数据库表是这样的
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
Run Code Online (Sandbox Code Playgroud)
我正在使用LINQ to SQL.在C#中,我只需要传递[Amount]和[Remarks]字段,其他字段必须使用其默认值([PropID]和[UpdatedOn]).
在C#中我创建了如下的tbl_CurrentProperties对象,
tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";
Run Code Online (Sandbox Code Playgroud)
然后将对象提交到数据上下文.但在这里,Linq分配'1/1/0001 12:00:00 AM'
了UpdatedOn字段.但这违反了SQL日期时间范围1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
并发生异常.此外,我不能手动为DateTime
字段分配NULL值,因为它是一个不可为空的类型.无论如何,我需要使这个使用它的DEFAULT约束.我该怎么做呢?
PS:我想这样使用它,因为,我的数据库是在线的,用户在不同的位置.因此,如果我使用DateTime.Now,则用户计算机中的时间可能是错误的,并且它向DB中插入了错误的值.我总是需要使用SQL服务器时间.
安德烈的 回答是部分正确的.我刚测试了这个,这就是我发现的.
在dbml设计器中,在UpdatedOn
列上设置以下内容:
Auto Generated Value = True
Nullable = False
Run Code Online (Sandbox Code Playgroud)
然后,上INSERT
如果使用SQL Server事件探查器来查看生成的SQL,你会发现UpdatedOn
是不包括在INSERT.甚至不是空值.这一点很重要:为SQL Server使用默认值,为科拉姆,列必须省略从INSERT
.如果设置Nullable = True
为UpdatedOn
,则LINQ to SQL 可能包含INSERT
带有null值的列.
仅供参考,紧接着INSERT
应该有一个SELECT
LINQ to SQL正在检索自动生成的值,因此您的实体对象具有最新值.