2011-04-14 60 views
11

我正在使用實體框架代碼首先,我有一個使用StartTime屬性,EndTime屬性和Duration屬性(以及其他一些屬性)定義的實體。 Duration屬性是一個計算字段,它是開始和結束時間之間的持續時間(分鐘)。我的屬性聲明如下:使用實體框架存儲只讀計算字段代碼優先

public DateTime StartTime { get; set; } 
public DateTime EndTime { get; set; } 
public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
} 

我想運行這個計算的代碼,但具有持續時間值保存到數據庫與起始和結束時間值一起(以方便以後的路線當我來運行報告反對這些數字)。

我的問題是,我怎麼能得到這個只讀屬性映射回來,並保存到數據庫中使用代碼第一?

回答

19

通過Slauma的回答啓發,我能夠實現我通過使用保護二傳手瞄準。這將該值保留回數據庫,但不允許在其他地方修改該值。

我的財產,現在看起來是這樣的:

public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
    protected set {} 
} 
+0

啊,好主意,以它的保護!你是否也試圖讓制定者爲「私人」?知道EF是否會將該屬性映射到數據庫列會很有趣。 – Slauma 2011-04-14 14:05:09

+1

我剛剛嘗試過一個「私人」制定者,並且令人驚訝的是它繼續工作! – KevB 2011-04-14 15:02:27

+3

EF每次加載此實體時都會更新數據庫。我們猜測EF的變更跟蹤錯誤地認爲這個屬性已經改變。對我們來說,這會導致意外的併發衝突。 – 2012-12-05 23:33:49

2

供應空二傳手可能是一個可能的解決方案(雖然那麼屬性不再只讀,當然):

public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
    set { } 
} 

據我所知,只讀屬性不可映射到在列數據庫。