簡體   English   中英

項目更新時,CreatedAt字段變為空值

[英]CreatedAt field turns into null value upon item update

我在更新項目時遇到問題。 創建新項目時,將使用當前時間和日期填充CreatedAt值。 編輯項目時,CreatedAt值立即設置為null。 UpdatedAt值已正確設置,但CreatedAt在數據庫中設置為null。

這是ItemViewModel類:

public class ItemViewModel
{
    public int ItemId { get; set; }
    public string ItemName { get; set; }
    public int UserId { get; set; }
    public string CreatedBy { get; set; }
    public DateTime? CreatedAt { get; set; }
    public string UpdatedBy { get; set; }
    public DateTime? UpdatedAt { get; set; }

    public virtual User User { get; set; }
}

這是我用過的更新方法:

public void UpdateItem(ItemViewModel viewModel)
{
    item.UpdatedBy = WebSecurity.CurrentUserName;
    item.UpdatedAt = DateTime.Now;
    db.SaveChanges();
}

以下create方法正確填充CreatedAt值:

public int CreateItem(ItemViewModel viewModel)
{
    var item = new Item();
    viewModel.CopyToItem(item); 

    item.UserId = WebSecurity.CurrentUserId;
    item.CreatedBy = WebSecurity.CurrentUserName;
    item.CreatedAt = DateTime.Now;

    db.Items.Add(item);
    db.SaveChanges();
    return item.ItemId;
}

有什么我錯過了嗎?

您應該使用EntityState檢查條目是否已修改為:

public void UpdateItem(ItemViewModel viewModel)
{
    var item=db.Table.where(x=>x.ID==viewModel.ID).FirstOrDefault();
    item.UpdatedBy = WebSecurity.CurrentUserName;
    item.UpdatedAt = DateTime.Now;
    db.Entry(item).state=EntityState.Modified;
    db.SaveChanges();
}

在這個方法中:

public void UpdateItem(ItemViewModel viewModel)
{
    item.UpdatedBy = WebSecurity.CurrentUserName;
    item.UpdatedAt = DateTime.Now;
    db.SaveChanges();
}

viewModel來自哪里? (而且,想一想,什么是item ?)這是一個客戶端表單調用的動作嗎? 我懷疑這里發生的是客戶端表單不包含CreatedAt的數據,因此在為此方法構建參數時,模型綁定器將值CreatedAtnull

模型綁定器不夠“足夠智能”來獲取模型的當前持久狀態並將其與來自表單的內容合並。 只有來自形式的東西。 所以你基本上有兩個選擇:

  1. 堅持頁面的表單元素,准確地重新構建模型所需的所有數據。
  2. 至少在頁面的表單元素中保留模型的標識符,在服務器端代碼中使用該標識符從持久化數據中重新獲取模型的狀態。

對於第一個選項,您需要包含CreatedAt 這可能是一件簡單的事情:

@Html.HiddenFor(model => model.CreatedAt)

試試這樣吧

 var data= db.Items.where(x=>x.ID==viewModel.ID).SingleOrDefault();
    foreach(db.Items in data)
    {
        item.UpdatedBy = WebSecurity.CurrentUserName;
        item.UpdatedAt = DateTime.Now;
    }
     db.SaveChanges();

暫無
暫無

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

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