【发布时间】:2011-06-12 14:53:12
【问题描述】:
我的数据库表是这样的
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 值,因为它是不可为空的类型。无论如何,我需要这样做才能使用其默认约束。我该怎么做?
PS:我想这样使用它,因为我的数据库是在线的,而用户位于不同的位置。所以如果我使用 DateTime.Now,用户机器中的时间可能是错误的,它会在 DB 中插入一个错误的值。我需要始终使用 SQL 服务器时间。
【问题讨论】:
-
当然,如果您将业务逻辑从数据库中移到代码中,那么您就不会遇到这个问题 :-)
-
有些东西,比如创建日期,最好放在数据库中
-
@Andrey:很多人会强烈反对你。也许这在 10 年前是可以接受的,但现在可以说所有业务逻辑都应该集中在代码中。
-
我不认为这是生意,添加的日期是数据完整性。如果有业务添加日期,我会单独存储。
标签: c# sql linq-to-sql datetime default-constraint