0

繼續從SO dicsussion here開始,我實現了部分類,以便爲構造函數中的「創建」和「修改」數據庫字段創建默認日期時間值。EF部分類和默認值

現在的問題是,我的數據庫有100多個表,其中75+具有相同的基本結構,其中包括創建和修改列定義。

因此..而不是創建75+部分類,我需要維護,有沒有什麼辦法可以創建一個每個EF類型繼承的基類,它繼承默認的構造函數來填充Created和DateTime值改性?

編輯:值得說明的是,我使用EF 4.0

+1

是否有一個原因,你沒有使用'StoreGeneratedPattern =「Computed」'? – 2010-11-05 04:02:39

+0

,因爲我的理解是每次更新對象時都會覆蓋它。 – Darbio 2010-11-05 04:47:00

+0

此行爲已在此驗證:http://msdn.microsoft.com/en-us/library/system.data.metadata.edm.storegeneratedpattern.aspx – Darbio 2010-11-05 05:01:39

回答

1

你可以肯定地指定你自己的EF4和EF1的基類,但EF4更容易。右鍵單擊設計界面,您應該看到一個添加代碼生成項的選項。選擇ADO.Net實體對象生成器。這會將T4文件添加到項目(.tt擴展名)中,該文件指定用於從模型生成實體類的模板。要指定不同的基類,請在其內部尋找一條線,如

Private Function BaseTypeName(ByVal entity As EntityType, ByVal code As CodeGenerationTools) As String 
    Return If(entity.BaseType Is Nothing, "EntityObject", MultiSchemaEscape(DirectCast(entity.BaseType, StructuralType), code)) 
End Function 

用您的基類替換EntityObject。請注意,如果您使用此模板,那麼您的基類必須從System.Data.Objects.DataClasses.EntityObject繼承 - 您可以使用POCO模板,但這對您來說可能已足夠。

1

你可以肯定的告訴EF使用一個基類的實體(這是正確的設計師作爲實體屬性)......但如果你想確認這個字段的默認值,也許你可以在你的ObjectContext的SavingChanges和ObjectMaterialized上掛鉤兩個事件。

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.savingchanges.aspx

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.objectmaterialized.aspx

你可以利用這些機會來注入要使用默認值(S)。因此,在您的SavingChanges處理程序中,例如,您可以在上下文中檢查ObjectStateManager以查看相關實體的狀態是否爲EntityState.Added,然後根據需要設置Created和Modified日期。

另外,如建議,是否有一個原因SQL Server中的列的默認值不能只是GetDate()? (假設你使用的是SQL Server)... ...

+0

謝謝傑夫。是的,由於某些原因,默認值不會從SQL Server傳播到EF,事實上,我已經將默認值設置爲getdate(),但是當我在EF中填充對象時,SqlServer上的日期設置爲DateTime.Minimum。至於在設計器中設置基類,我看到了這一點,但它只允許您在EF模型中選擇一個類,而不是在設計器之外創建的類。 – Darbio 2010-11-05 04:33:31