C# 将空值传递给LINQ中的DateTime字段

C# 将空值传递给LINQ中的DateTime字段,c#,sql,linq-to-sql,datetime,default-constraint,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] VARCHA

我的数据库表是这样的

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
我正在使用LINQtoSQL。在C#中,我只需要传递[Amount]和[Comments]字段,其他字段必须与其默认值([PropID]和[UpdateOn])一起使用

在C#中,我创建tbl#U CurrentProperties对象,如下所示

tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";
然后将对象提交到数据上下文。但在这里,Linq为UpdateOn字段分配了
'1/1/0001 12:00:00 AM'
。但这违反了SQL日期时间范围
1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM
,并发生异常。此外,我无法手动为
DateTime
字段分配空值,因为它是不可为空的类型。无论如何,我需要使用它的默认约束。我该怎么做



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

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


每当
linqtosql
生成错误的
DBML
时,最好自己编辑它。

打开你的DBML并打开它 “自动生成值”=对于自动生成的字段为true。在

中传递空值应该是很好的。在一定程度上是正确的。我刚刚测试了这个,这是我发现的

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

Auto Generated Value = True 
Nullable = False
然后,在
INSERT
上,如果使用查看生成的SQL,您将看到
UpdatedOn
未包含在INSERT中。甚至不是空值。这一点很重要:对于SQL Server,要使用该列的默认值,必须从
插入中省略该列。如果在
UpdatedOn
上设置
Nullable=True
,则LINQ to SQL可能会在
INSERT
上包含一个空值的列


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

当然,如果您将业务逻辑移出数据库并放入代码中,这样你就不会有这个问题了:-)有些东西,比如date created,在db@Andrey当前位置很多人都会强烈反对你。也许这在10年前是可以接受的,但现在所有的业务逻辑都应该集中在代码中。我不认为这是业务,添加的日期是数据完整性。如果有业务添加日期,我会单独存储它。dbml生成错误的xml,因为设置错误。见我的回答谢谢你的回答。但将此值设置为NULL无效。正如shaunmartin和Andrey提到的,“自动生成的值=真”是正确的。无论如何,谢谢你的帮助。:)谢谢Andrey,它传递了一个空值。但由于此字段不为空,因此会发生此错误。“无法将值NULL插入到表'myDataContext.tbl_CurrentProperty'的'UpdateOn'列中;该列不允许NULL。insert失败。语句已终止。”这可能是设计问题。您的数据库应该恢复一个值来设置字段,自动生成值(在这种情况下,我的解决方案可以工作),或者允许字段为null。您不应该使用诸如min date time之类的内容来表示空值。如果您出于某种原因确实需要代码中的sql最小日期时间,您可以将其作为System.Data.SqlTypes.SqlDateTime.MinValue()@Kushan:这个答案是正确的。正如shaunmartin所指出的,如果与反气旋的答案相结合,它将不起作用。您需要将列设置回不可为空,并设置为
DateTime
(不是
DateTime?
),然后按照Andrey的建议设置
Auto-Generated=True