2014-03-03 29 views
0

我爲文章創建了一個模型,在文章中我試圖實現在初始創建時創建的日期。C#中的DateTime.Now ASP.NET MVC 4

//型號

[Display(Name = "Date Created")] 
    public DateTime dateCreated 
    { 
     get { return DateTime.Now; } 
    } 

它工作得很好,當我創建了一篇文章,但它也將在同一天時間值到所有的其他文章。 :/

有沒有辦法解決這個問題?

歡呼聲。

+0

我認爲模型屬性需要讀/寫。他們還能從客戶端反序列化嗎? –

回答

2

它在我創建文章時效果很好,但它也爲所有其他文章設置了相同的日期 時間值。

這正是爲什麼它是一個壞主意。得到你所做的就是暴露當前的日期和時間與該屬性。

爲什麼在保存更改之前無法正確設置?

例如:

public override int SaveChanges() 
{ 
    DateTime saveTime = DateTime.Now; 
    foreach (var entry in this.ChangeTracker.Entries().Where(e => e.State == System.Data.EntityState.Added)) 
    { 
    if (entry.Property("dateCreated").CurrentValue == null) 
     entry.Property("dateCreated").CurrentValue = saveTime; 
    } 
    return base.SaveChanges(); 

} 
4

把在一個屬性中的每個屬性被訪問時將評估DateTime.Now,所以如果您的查詢兩次,你會得到兩個不同的值。

有許多用於模擬這種可能的選擇,但通常你會想要一個只讀屬性在構造函數中設置-ED:

public Article() 
{ 
    This.DateCreated = DateTime.Now; 
} 

[Display(Name = "Date Created")] 
public DateTime DateCreated {get; private set;} 
+1

這是一種錯誤的做法..如果保存一分鐘後會發生什麼?它不會反映創作的真實時間。 –

+0

@YairNevet它真的取決於你如何解釋「創建」。是當你實例化對象嗎?當你執行一些「保存」功能嗎?它是否最終到達數據存儲區?鑑於OP沒有那麼詳細,並且對於大多數方法來說,在創建對象之後會發生保存,我認爲這種方法很好。否則,在數據庫上放置一個'TRIGGER'或'DEFAULT'約束。 – Alejandro

+0

在數據庫中創建對象時,您希望看到大多數時間,否則此對象只是一個內存對象。 –

2

這裏有您需要什麼:

private DateTime? dateCreated; 
public DateTime DateCreated 
{ 
    get { return dateCreated ?? DateTime.Now; } 
    set { dateCreated = value; } 
} 

這樣做是等到這個屬性第一次訪問。然後,它會查看是否已經設置了創建日期,如果沒有,則會將其設置爲DateTime.Now。對於初始創建,這通常會在EF嘗試將其保存到數據庫時發生,這正是您希望發生這種情況的原因。如果您在保存之前嘗試手動訪問該屬性,它只會更早發生,但沒有理由說明您會這樣做。 set方法只允許一個普通的設置,所以當EF從數據庫中提取這個數據時,它只會設置私有字段,並且它將始終設置爲該字段。

+0

這應該工作,但不知何故編輯模型實體時,dateCreated字段變爲空,然後再次設置爲DateTime.Now。 – Igor

+0

你需要確保你不隱式發佈一個值。如果您直接在窗體中使用該實體,但不包含'DateCreated'屬性的至少一個隱藏字段,則它將被設置爲空。您需要包含一個隱藏字段(不理想),手動映射來自從數據庫中新建的實體後的值,或使用視圖模型執行相同操作。關鍵在於在更新實體之前,您需要確保原始值已經存在。 –

+0

我現在明白了。該表單將爲其發佈空值。我編輯控制器以在保留更改之前從數據庫中提取日期。我想知道viewModel在這裏如何適合MVC的圖片。 – Igor