5

我的数据库表是这样的

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 分配'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 值,因为它是不可为空的类型。无论如何,我需要这样做才能使用其默认约束。我该怎么做呢?


PS:我想这样使用它,因为我的数据库是在线的,而用户位于不同的位置。所以如果我使用 DateTime.Now,用户机器中的时间可能是错误的,它会在 DB 中插入一个错误的值。我需要始终使用 SQL 服务器时间。

4

3 回答 3

7

安德烈的 回答部分正确。我刚刚对此进行了测试,这就是我发现的。

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

Auto Generated Value = True 
Nullable = False

然后,INSERT如果您使用SQL Server Profiler查看生成的 SQL,您会发现它UpdatedOn包含在 INSERT 中。甚至没有空值。这很重要:要让 SQL Server 使用该列的默认值,该列必须INSERT. 如果在Nullable = True上设置UpdatedOn,LINQ to SQL可能会在 上INSERT包含具有空值的列。

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

于 2011-01-20T19:37:27.070 回答
3

打开您的 dbml 并为自动生成的字段打开 "Auto Generated Value" = true。你应该很好地传入空值

于 2011-01-20T17:16:33.147 回答
2

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

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

于 2011-01-20T17:12:35.550 回答