将空值传递到LINQ中的DateTime字段
-
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#i创建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使用该柱子的默认值,列 必须省略 来自 INSERT
. 。如果您设置 Nullable = True
在 UpdatedOn
, ,linq到SQL 可能 包括 INSERT
带有零值。
仅供参考,紧随其后 INSERT
应该有一个 SELECT
LINQ到SQL的地方正在检索自动生成的值,因此您的实体对象具有最新值。
其他提示
打开您的DBML并打开“自动生成的值” =对于自动生成的字段的true。你应该很好地传递零。
我建议你打开你的 DBML
文件使用 XML Editor
并从 DateTime
至 DateTime?
通过允许零。保存它,代码将为您生成。
每当 LINQ to SQL
产生错误 DBML
, ,最好自己编辑。