我的数据库(MS SQL 2008)中有一个表,其列SYSUTCDATETIME ()
的默认值。
创意是在创建新记录后自动添加日期和时间。
我使用EF4创建了我的概念模型,并且我在INSERT MODE中创建了一个带有DetailsView控件的ASP.PAGE。
我的问题:
当我创建新记录时。 EF无法插入实际的日期和时间值,但会插入此值0001-01-01 00:00:00.00。
我认为EF无法使用我的DataBase中定义的SYSUTCDATETIME()
知道怎么解决吗?感谢
这是我的SQL脚本
CREATE TABLE dbo.CmsAdvertisers
(
AdvertiserId int NOT NULL IDENTITY
CONSTRAINT PK_CmsAdvertisers_AdvertiserId PRIMARY KEY,
DateCreated dateTime2(2) NOT NULL
CONSTRAINT DF_CmsAdvertisers_DateCreated DEFAULT sysutcdatetime (),
ReferenceAdvertiser varchar(64) NOT NULL,
NoteInternal nvarchar(256) NOT NULL
CONSTRAINT DF_CmsAdvertisers_NoteInternal DEFAULT ''
);
我的临时解决方案: 请各位帮帮我
e.Values [“DateCreated”] = DateTime.UtcNow;
更多信息:
http://msdn.microsoft.com/en-us/library/bb387157.aspx
How to use the default Entity Framework and default date values
答案 0 :(得分:1)
问题是EF不知道该默认值,因此它将.NET默认值发送到数据库。可以强制EF使用DB的默认值,但您必须手动修改EDMX文件(XML而非设计者)。您必须在EDMX的SSDL部分中找到列定义,并添加StoreGeneratedPattern =“Computed”属性。您在CSDL部分也必须相同(这可以在设计师中完成)。
此设置会有几个问题。首先,数据库中的每个更新都将删除您在SSDL中的更改。此外,每次插入和更新都会触发select,这将从该列重新查询值(因为EF认为每次都计算它)。
答案 1 :(得分:1)
在创建记录的ASP .NET页面中,实际上是为DateCreated
值添加了值。我看到你现在正在做这件事,这是你首先需要做的事情。
所以我猜想之前发生的事情是你创建新记录但没有为DateCreated
字段设置值。但由于DateTime
的默认值为0001-01-01 00:00:00.00
,因此您就是这种行为的原因。
默认值仅适用于您插入行但不提供如何处理DateCreated
字段的情况。但EF的工作方式始终是为此提供一个值(除非你编写自己的插入查询来覆盖生成的插入查询)。
您还可能在更新记录时随时更改值,因为EF不知道如何处理它。