2013-07-23 58 views
0

時,我已經看到在我創建了一個局部類重寫ToSting方法,並提供了一些基本的屬性設置,我有一個實體的一些奇怪的行爲檢索到的每個記錄當創建該實體的新實例時(例如,我可能會在構造函數中將訂單日期設置爲'Now')。爲什麼「新」被要求使用實體框架

這種古怪的行爲使我在部分班級仔細一看,我很驚訝地看到,即使是被檢索到的一組預先存在的記錄是被稱爲每個檢索記錄的構造。

下面

是什麼,我可能有一個很簡單的例子:

Partial Public Class Product 


Public Sub New() 

    CostPrice = 0.0 
    ListPrice = 0.0 

End Sub 
Public Overrides Function ToString() As String 
    Return ProductDescription 
End Function 
End Class 

我從這個出現的兩個問題:

1)是在實體框架如果添加了這種正常行爲你添加構造函數的部分類?

2)如果不是,那麼我必須假設我做了錯誤的事情,那麼 會重寫構造函數以做類似於上面提到的例子的正確方法?

感謝您能給我任何見解。

這是一個VB工程

+1

構造函數_always_調用。 – Magnus

回答

1

認爲事件導致從數據庫中實體的檢索順序使用EF 5.0。基本上,它應該是這樣的:

  • 查詢數據庫
  • 對查詢結果的各行給實體

佈施是那麼作爲遵循對每一檢索到的行:

  • 創建檢索到的實體的新實例
  • 使用行的值填充此新實例

那麼每個實例的創建,調用構造函數。

我覺得你混合:

在您執行業務邏輯
  • 實例初始化,你「分配」的對象,
  • 業務初始化

都可以進行,至少部分,在構造函數中。

+0

謝謝。你說的話有很大的意義,並且引出了一個明顯的問題,那麼在分配一個已經存在於數據庫中的現有對象的初始化和一個不存在的初始化之間如何區分初始化呢? –

+0

通常使用「工廠」模式。基本上你有一個靜態方法,給你一個新的,正確初始化的對象實例。就像'public static SomeType GetNewSomeType(){SomeType o = new SomeType(); o.Property1 = someValue;返回o;}'。我寫了一些關於[this]的內容(http://madbuildertools.blogspot.fr/2011/08/managing-default-values-for-entities-in.html)。 – tschmit007

0

new總是在類初次實例化時調用,並且如果您沒有顯式聲明構造函數,則會調用default constructor will be created by the compiler

除非該類是靜態的,否則C#編譯器將爲其提供一個公共缺省構造函數,以啓用類實例化。

當定義了實體框架POCO類的類必須有一個默認的構造函數和EF總是會調用這個默認構造是否已經明確定義,或編譯器這樣做是爲了你。

如果你有需要時,它被實例化,你可以use the ObjectContext.ObjectMaterialized event任何東西傳遞到類的任何原因。在創建對象時

相關問題