2010-04-29 132 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命名空間或部分不應該列出屬性(並且不應該是部分的);]!