Entity framework 如何使用实体框架管理GetDate()

Entity framework 如何使用实体框架管理GetDate(),entity-framework,sql-server-2008,Entity Framework,Sql Server 2008,在我的一个数据库表中有这样一列 DateCreated, datetime, default(GetDate()), not null 我正在尝试使用实体框架在这个表上进行插入,如下所示 PlaygroundEntities context = new PlaygroundEntities(); Person p = new Person { Status = PersonStatus.Alive,

在我的一个数据库表中有这样一列

DateCreated, datetime, default(GetDate()), not null
我正在尝试使用实体框架在这个表上进行插入,如下所示

        PlaygroundEntities context = new PlaygroundEntities();

        Person p = new Person
        {
            Status = PersonStatus.Alive,
            BirthDate = new DateTime(1982,3,18),
            Name = "Joe Smith"
        };

        context.AddToPeople(p);
        context.SaveChanges();
当我运行这段代码时,我得到以下错误

The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated.

所以我尝试将StoreGeneratedPattern设置为computed。。。同样的事情,然后身份。。。同样的事情。有什么想法吗?

将DateCreated的类型更改为datetime2可能会解决问题

日期时间2007-05-08 12:35:29.123

日期时间2007-05-0812:35:29。12345


Ref:

您必须手动编辑edmx xml,并将SSDL StoreGeneratedPattern属性设置为identity或computed。但是,无论何时通过设计器更新edmx,您的更改都将被覆盖

这是一个众所周知的问题。有关详细信息,请参阅以下链接:


这里有一个解决方法:

1) 如其他地方所述,将列更改为datetime2。这修复了转换错误

2) 添加将DateCreated设置为getdate()的触发器

3) 如有必要,设置

p.DateCreated = DateTime.MinValue;
只是为了初始化它

4) 如果需要从数据库创建的日期,请添加

context.Refresh(System.Data.Objects.RefreshMode.StoreWins, p);
刚过

context.SaveChanges();

我也有同样的问题!对我来说,它是这样工作的:

数据库MS SQL Server express:

[RowTime]  [datetime2](7)  NOT NULL

ALTER TABLE [dbo].[Table_1] ADD  CONSTRAINT [DF_Table_1_RowTime]  DEFAULT (getdate()) FOR [RowTime]
GO
然后将表从数据库导入实体模型。 实体将无法实现默认值! 因此,必须将列的StoreGeneratedPattern设置为Computed。 然后实体将不再在那里放置任何默认值

结合:

datetime2,
NOT NULL, 
StoreGeneratedPattern=Computed

为我工作

关注我不想更改数据库这一事实,因为这是一个应用程序问题,我希望有一天他们能解决这个问题,我的解决方案(在我的情况下完全可能)是创建模型的部分类来纠正构造函数上的问题:

public partial class Log
{
    public Log()
    {
        this.Date = DateTime.Now;
    }
}
这对我很有用,因为:

  • 我在将模型发送到数据库时就创建了模型
  • 我使用云来提供这些服务,应用程序和数据库服务器的日期时间必须相同

不要忘记名称空间需要与模型名称空间匹配,否则partial不应该列出属性(也不应该是partial;])

解决了异常,但默认值(GetDate())在insert上没有被调用。实际上,它看起来确实有效,但是.net代码默认设置为datetime.minvalue。有没有办法阻止它这样做?我有一个确切的问题,你能写一个正确的答案吗?请wcpro?@wcpro你到底是如何配置storegeneratedpattern来解决这个问题的?在edmx文件中,右键单击字段->属性->将storegeneratedpattern从无更改为计算,然后保存。。。适用于我。Visual Studio 2010允许您现在设置此设置,而无需编辑edmx文件。@ICodeForCoffee正如KenB提到的,当前存在一个错误,并且Visual Studio UI中的此设置未正确应用于.edmx文件。真烦人:[
public partial class Log
{
    public Log()
    {
        this.Date = DateTime.Now;
    }
}