2012-04-26 54 views
2

默認DateTime值爲了簡單起見,假設我有一個SQL Server CE表稱爲Widgets如何使用與SQL Server CE和Entity Framework

create table [Widgets] (
    [Id] int not null primary key, 
    [Created] datetime not null default getdate()) 

插入,而不指定值的Created列工作原理預計:

insert into [Widgets] ([Id]) values (1) 

產生所謂Database實體框架模型後,我寫下面的代碼:

Database db = new Database(); 
db.Widgets.AddObject(new Widget { Id = 2 }); 
db.SaveChanges(); 

但它引發了一個異常:An overflow occurred while converting to datetime.我跟蹤下來的事實,EF看到Created列作爲非可空DateTime,所以當構建一個新Widget,其Created屬性被設置爲默認DateTime (0001-01-01 12:00:00),這在SQL Server CE的有效範圍之外。

那麼,如何讓上面的C#示例工作?我不想更改數據庫模式。我知道我可以在Widget的構造函數中將Created屬性設置爲DateTime.Now,但是從構建Widget直到它實際插入到數據庫中(這是我想要捕獲的實際時間)爲止,可能需要幾分鐘的時間。

更新:我試着設置StoreGeneratedPatternIdentityComputed,但它提出了一個例外:Server-generated keys and server-generated values are not supported by SQL Server Compact。默認值在SQL Server CE中起作用,所以它必須是實體框架的限制。 (顯然,這是固定在SQL Server CE 4.0。)

+0

可能的重複http://stackoverflow.com/questions/6846952/disabling-entity-frameworks-default-value-generation-code-first – 2012-04-26 23:31:41

+0

@TonyHopkinson該問題的答案不能滿足我的問題。如上一段所述,在構造函數中設置默認值不會調用正確的行爲。構建Widget的時間可能與實際插入數據庫的時間相距數分鐘。 – jordanbtucker 2012-04-26 23:38:05

+1

相關問題:http://stackoverflow.com/questions/6237619/ef-4-1-how-to-add-a-default-on-insertion-for-datetime-column – devuxer 2012-04-27 00:35:29

回答

1

看起來DanM的相關問題,鏈接指向我朝着正確的方向朝着變化跟蹤。下面的代碼將變得相當接近我在尋找的行爲:

public partial class Database 
{ 
    public override int SaveChanges(SaveOptions options) 
    { 
    foreach(var w in this.ObjectStateManager 
         .GetObjectStateEntries(EntityState.Added) 
         .Where(e => e.Entity is Widget) 
         .Select(e => (Widget)e.Entity)) 
    { 
     if(w.Created == default(DateTime)) 
     w.Created = DateTime.Now; 
    } 

    return base.SaveChanges(options); 
    } 
} 

所有Widget S'Created值將被設置爲當前日期和時間。我看到的唯一其他問題是,該值是根據客戶端的時鐘設置的,而不是服務器的。如果你一次插入很多行,時間戳會比普通插入的要早一點。

最好的解決方案將允許SQL Server執行它配置的操作 - 如果未提供,請設置列的值。這就是生活。

1

您可以設置窗口小部件分部類的創建屬性的構造函數中:

public partial class Widget 
    { 
     public Widget() 
     { 
      this.Created = System.DateTime.Now; 
     } 
    } 
+0

雖然這可能適用於某些實現,但它不適用於此實現。就像我在OP中和幾個評論中所說的那樣:構建Widget的時間可能與實際插入數據庫的時間相距甚遠。 – jordanbtucker 2012-04-27 15:15:20

相關問題