簡體   English   中英

如何定義Entity列,使其在創建時具有默認值,但可以通過Entity Framwork覆蓋?

[英]How can I define an Entity column so that it has a default value on creation but can be overwritten via Entity Framwork?

在我的Users表中,我有一個名為CreatedOn的列,該列的“默認值或綁定”設置為(getdate()) 在此模型的.edmx文件中,我將此列定義為<Property Name="CreatedOn" Type="datetime2" Precision="7" Nullable="false" StoreGeneratedPattern="Computed"/>

  • 優點:創建時將該字段設置為當前時間戳
  • 缺點:我無法通過實體框架更改字段

但是,我可以將.edmx文件中的字段定義更改為StoreGeneratedPattern="None" ,這給了我:

  • 優勢:創建后,我可以通過實體框架隨時更改字段
  • 缺點:創建時未將字段設置為當前時間戳

問題在於,當我為.edmx文件中的此列指定StoredGeneratedPattern="None"時,實體框架而不是讓數據庫自行設置GETTIME()而是發送值0001-01-01 00:00:00然后覆蓋數據庫默認值。 我從記錄Entity發送的SQL語句中知道了這一點: INSERT [dbo].[Users]([LoginName], [Password], ..., [CreatedOn]) VALUES (@0, @1, ..., @7) where @7 = '0001-01-01 00:00:00' (Type = DateTime2)

我必須做些什么才能得到以下信息:

  • 優點:創建時將該字段設置為當前時間戳
  • 優點:創建實體后,可以隨時通過Entity Framework更改此字段的值

您可以使用第二種方法並通過在保存應用程序代碼之前將CreatedOn設置為DateTime.Now來減輕不利影響。 因此, CreatedOn道具完全由應用程序中的應用程序代碼管理,但是如果直接在數據庫中創建User則默認約束將生效。

以下是根據情況使用設置CreatedOn的幾種方法:

  1. 像保存任何其他屬性一樣在保存之前進行設置。
  2. 正如評論中提到的ESG一樣,在無參數構造函數中設置它。
  3. 如果像存儲庫模式一樣在EF之上使用抽象層,則可以創建一個包含CreatedOn屬性的抽象基類或接口,並在要向其添加道具的任何類中繼承/實現。 然后創建一個基本的存儲庫保存方法,該方法檢查要保存的對象是否具有CreatedOn屬性的類型,如果是,則在保存之前進行設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM