实体框架4和SYSUTCDATETIME()

时间:2011-02-21 14:34:53

标签: c# tsql entity-framework entity-framework-4

我的数据库(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

http://msdn.microsoft.com/en-us/library/dd296755.aspx

2 个答案:

答案 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不知道如何处理它。