我的数据库表是这样的
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服务器时间。
答案 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
时,最好自行编辑。