2010-04-29 113 views
18

管理GETDATE()我有这样一个列在我的数据库表如何与实体框架

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

1我试图使用实体框架上做此表下面的INSERT .. 。

 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. 

所以我试图设置StoreGenerat edPattern计算出...相同的东西,然后标识...相同的东西。有任何想法吗?

回答

2

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

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

DATETIME2 2007-05-08 12时35分29秒。 12345

编号:http://technet.microsoft.com/en-us/library/bb677335.aspx67

+0

解决了这个异常,但是在插入时没有调用默认的(GetDate())。 – 2010-04-29 20:46:55

+0

实际上,它看起来确实有效,但.net代码的默认设置就像datetime.minvalue。有没有办法阻止它做到这一点? – 2010-04-29 21:02:22

+2

通过使用计算得到它工作storegeneratedpattern – 2010-04-29 21:34:25

9

您必须手动编辑EDMX XML和设置您的SSDL StoreGeneratedPattern属性标识或计算。但是,无论何时通过设计人员更新您的edmx,您的更改都会被覆盖。

这是一个已知问题。请参阅以下链接了解详情:

Microsoft Connect Ticket

Using a GUID as an EntityKey in Entity Framework 4

+0

Visual Studio 2010允许您现在设置它,而无需编辑edmx文件。 – ICodeForCoffee 2011-03-03 15:55:09

+0

@CodeForCoffee KenB提到,目前存在一个错误,Visual Studio UI中的这个设置没有正确应用到.edmx文件。真的很烦人:[ – RedFilter 2011-05-11 22:39:01

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)如果neccessary,设置

p.DateCreated = DateTime.MinValue; 

只是将其初始化。

4)如果你从数据库中所需要的dateCreated会,加

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

刚过

context.SaveChanges(); 
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 

对我的作品!

1

关注这个事实,我不想更改数据库,因为它是一个应用程序问题,我期望他们有一天能够解决这个问题,我的解决方案(对我来说完全可能)是创建一个局部类模型来纠正构造问题:

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

这对我的作品,因为:

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

不要忘记命名空间需要匹配Model命名空间或部分不应该列出属性(并且不应该是部分的);]!