如何使用Entity Framework管理GetDate()

时间:2010-04-29 20:28:59

标签: entity-framework sql-server-2008

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

DateCreated, datetime, default(GetDate()), not null

我正在尝试使用Entity Framework在此表上执行插入,如此...

        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设置为计算...同样的事情,然后身份......同样的事情。有什么想法吗?

5 个答案:

答案 0 :(得分:9)

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

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

Microsoft Connect Ticket

Using a GUID as an EntityKey in Entity Framework 4

答案 1 :(得分:4)

我遇到了同样的问题!对我来说,它的工作原理如下:

数据库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

适合我!

答案 2 :(得分:2)

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

datetime 2007-05-08 12:35:29.123

datetime2 2007-05-08 12:35:29 12345

参考:http://technet.microsoft.com/en-us/library/bb677335.aspx67

答案 3 :(得分:2)

这是一个有效的解决方法:

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

2)添加一个触发器,将DateCreated设置为getdate();

CREATE TRIGGER [TR_AS_ChangeTime] ON [AS_ApplicationSession] 
  AFTER INSERT,UPDATE AS
BEGIN

  SET NOCOUNT ON;
  UPDATE AS_ApplicationSession 
  SET AS_ChangeTime = getdate() 
  WHERE AS_Id IN(SELECT AS_ID FROM INSERTED)

END

3)如有必要,请设置

p.DateCreated = DateTime.MinValue;

只是为了初始化它。

4)如果您需要数据库中的DateCreated,请添加

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

之后

context.SaveChanges();

答案 4 :(得分:1)

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

public partial class Log
{
    public Log()
    {
        this.Date = DateTime.Now;
    }
}

这对我有用,因为:

  • 我在将数据发送到数据库时创建模型。
  • 我将CLOUD用于这些服务,应用程序和数据库服务器中的日期时间必须相同!

不要忘记命名空间需要匹配模型命名空间或部分不应该列出属性(也不应该是部分属性;))!