将NULL值传递给LINQ中的DateTime字段

时间:2011-01-20 17:04:25

标签: c# sql linq-to-sql datetime 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

我正在使用LINQ to SQL。在C#中,我只需要传递[Amount]和[Remarks]字段,其他字段必须使用其默认值([PropID]和[UpdatedOn])。

在C#中,我创建了如下所示的tbl_CurrentProperties对象,

tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";

然后将对象提交到数据上下文。但是在这里,Linq为UpdatedOn字段分配了'1/1/0001 12:00:00 AM'。但这违反了SQL日期时间范围1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM并发生异常。此外,我无法为DateTime字段手动分配NULL值,因为它是一个不可为空的类型。无论如何,我需要使这个使用它的DEFAULT约束。我该怎么做?


PS:我想这样使用它,因为我的数据库是在线的,用户在不同的位置。因此,如果我使用DateTime.Now,则用户计算机中的时间可能是错误的,并且它向DB中插入了错误的值。我总是需要使用SQL服务器时间。

3 个答案:

答案 0 :(得分:7)

Andrey's answer部分正确。我刚测试了这个,这就是我发现的。

在您的dbml设计器中,在UpdatedOn列上设置以下内容:

Auto Generated Value = True 
Nullable = False

然后,如果您使用SQL Server Profiler查看生成的SQL,则在INSERT上,您会看到UpdatedOn 未包含在INSERT中 。甚至不是空值。这很重要:要使SQL Server使用该列的默认值,必须从INSERT中删除。如果在Nullable = True上设置UpdatedOn,则LINQ to SQL 可能INSERT上的列包含为空值。

仅供参考,在INSERT之后,应该有一个SELECT LINQ to SQL正在检索自动生成的值,因此您的实体对象具有最新值。

答案 1 :(得分:3)

打开dbml并启用 对于自动生成的字段,“自动生成的值”= true。在

中传递空值应该都很好

答案 2 :(得分:2)

我建议您使用DBML打开XML Editor文件,并通过允许空值将该列的类型从DateTime更改为DateTime?。保存它,代码将为您生成。

每当LINQ to SQL生成错误的DBML时,最好自行编辑。