我的数据库表就是这样

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 = TrueUpdatedOn, ,linq到SQL 可能 包括 INSERT 带有零值。

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

其他提示

打开您的DBML并打开“自动生成的值” =对于自动生成的字段的true。你应该很好地传递零。

我建议你打开你的 DBML 文件使用 XML Editor 并从 DateTimeDateTime? 通过允许零。保存它,代码将为您生成。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top