C# 实体框架4和SYSUTCDATETIME()

C# 实体框架4和SYSUTCDATETIME(),c#,tsql,entity-framework,entity-framework-4,C#,Tsql,Entity Framework,Entity Framework 4,我的数据库(MS SQL 2008)中有一个表,其列SYSUTCDATETIME()的默认值为 其想法是在创建新记录后立即自动添加日期和时间 我使用EF4创建了我的概念模型,并且在插入模式下创建了一个带有DetailsView控件的ASP.PAGE 我的问题: 当我创建新记录时。EF无法插入实际日期和时间值,但它会插入该值0001-01-01 00:00:00.00 我想EF不能使用数据库中定义的SYSUTCDATETIME() 你知道怎么解决吗?谢谢 这里是我的SQL脚本 CREATE

我的数据库(MS SQL 2008)中有一个表,其列
SYSUTCDATETIME()
的默认值为

其想法是在创建新记录后立即自动添加日期和时间

我使用EF4创建了我的概念模型,并且在插入模式下创建了一个带有DetailsView控件的ASP.PAGE

我的问题:

当我创建新记录时。EF无法插入实际日期和时间值,但它会插入该值0001-01-01 00:00:00.00

我想EF不能使用数据库中定义的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、 值[“DateCreated”]=DateTime.UtcNow

更多信息请点击此处:


问题是EF不知道该默认值,所以它会将.NET默认值发送到数据库。可以强制EF使用DB中的默认值,但必须手动修改EDMX文件(XML不是设计器)。您必须在EDMX的SSDL部分中找到列定义,并添加StoreGeneratedPattern=“Computed”属性。您还必须在CSDL部件中执行相同的操作(这可以在designer中完成)


此设置将有几个问题。首先,数据库中的每次更新都会删除您在SSDL中的更改。此外,每次插入和更新都将触发select,该选项将重新查询此列中的值(因为EF认为它每次都是计算出来的)。

在ASP.NET页面中,当您创建记录时,您实际上是在为
DateCreated
值添加值。我看到你现在正在这样做,这是你首先需要做的

所以我猜前面发生的事情是,您正在创建新记录,但没有为
DateCreated
字段设置值。但是由于
DateTime
的默认值为
0001-01-01 00:00:00.00
,因此您得到了该行为

默认值仅适用于插入行,但不指示如何处理
DateCreated
字段的情况。但EF的工作方式总是为此提供一个值(除非您编写自己的insert查询来覆盖生成的查询)


您还可能在任何时候更新记录时更改该值,因为EF不知道如何处理它。

正是我所想的,因此我保持简单并使用DateTime.UtcNow。我唯一的问题是:如果用户更改了其SO的日期时间,是否会影响将日期时间值传递给EF?谢谢