Entity Framework 4 and SYSUTCDATETIME ()

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

想法是在新记录创建时自动添加日期和时间。

我使用EF4创建了我的概念模型,并创建了一个ASP.PAGE,其中包含INSERT MODE的DetailsView控件。

我的问题:

当我创建一个新记录时,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.Values["DateCreated"] = DateTime.UtcNow;

更多信息请查看以下链接:

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

如何使用默认的Entity Framework和默认日期值

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

2个回答

1
问题在于EF不知道该默认值,因此将.NET默认值发送到数据库。可以强制EF使用来自DB的默认值,但必须手动修改EDMX文件(XML而不是设计师)。您必须在EDMX的SSDL部分中找到列定义,并添加StoreGeneratedPattern =“Computed”属性。您还必须在CSDL部分中执行相同操作(可以在设计器中完成)。
这个设置会有几个问题。首先,每次从数据库更新都会删除SSDL中的更改。此外,每次插入和更新都会触发选择,这将重新查询此列的值(因为EF认为它每次都是计算的)。

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

1
在您的ASP .NET页面中,当您创建记录时,您是否实际上为DateCreated值添加了一个值。我现在看到您正在这样做,这正是您首先需要做的事情。
所以我猜早些时候发生的事情是,您创建了新记录,但没有为DateCreated字段设置值。但由于DateTime具有默认值0001-01-01 00:00:00.00,因此您会得到这种行为。
默认值仅适用于插入行但未提供对DateCreated字段的操作指示的情况。但EF的工作方式始终会为此提供一个值(除非您编写自己的插入查询以覆盖生成的查询)。
每当更新记录时,您还可能会更改该值,因为EF不知道该怎么处理它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接