2012-03-13 44 views
0

我正在使用實體Framewirk 4和SQL Server 2008的應用程序,我從WCF Rest服務調用我的代碼。當我使用服務在數據庫中添加一條新記錄並在同一個會話中查詢數據庫時,它將返回除了可以爲空的計算列之外的所有信息,但是如果我在新建中執行相同的查詢會話,它會給我回報一切。實體框架無法讀取計算列的更改

爲該計算列

定義是

[ComputedColumn] AS(DATEADD(分鐘,[OffsetMinutes],[ActualTimeUTC]))

請開導我在此。

感謝

+0

你不能堅持* *數據爲計算列 - 這是** **計算作爲其名稱所暗示的,由SQL Server在內部。 – 2012-03-13 05:58:30

+0

但是必須有辦法讓數據恢復,或者我如何在另一個會話中獲取相同的數據。 – MegaMind 2012-03-13 06:00:53

+0

所以「ActualTimeUTC」和「OffsetMinutes」是數據庫中的列嗎? EF中的INSERT是否被填充? – 2012-03-13 06:15:09

回答

1

當我使用該服務

如果你做到這一點應該已經填補了當前實體實例爲您計算的數據在數據庫中添加一個新的記錄。你只需要標記列作爲代碼計算:一首:

modelBuilder.Entity<YourEntity>() 
      .Propety(e => e.YourComputedProperty) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

或數據註解

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 

EDMX via StoreGeneratedPattern

在同一會話

查詢數據庫,針對該記錄,它將所有信息返回給我,除了在可空的計算列中的信息外。

它返回您當前狀態已知的上下文because of identity map。除非強制執行此操作,否則EF不會再次從數據庫加載數據(即使它執行查詢)。它默認使用已存儲在上下文中的數據 - 您插入的數據。

要強制重裝比如,你可以這樣做:

context.Entry(yourEntityToBeReloaded).Reload(); 
+0

但是,我應該如何輸入值在計算列中,您知道「COMPUTED」意味着sql server具有知道該列中應輸入內容的邏輯/公式。此外,有時我只需要在計算列中輸入ID字段,所以沒有其他方法可以做到這一點。 – MegaMind 2012-03-13 09:59:05

+0

您不會向計算列輸入任何值。在將值與您傳遞的數據一起更新後,您將讓EF從數據庫爲您加載它。 – 2012-03-13 12:31:40

+0

我在期待同樣的事情,但EF沒有加載計算列值,並且根據您的答案EF正在返回由對象已知的當前狀態。是重新加載是我可以使用的唯一的東西, – MegaMind 2012-03-14 03:53:27