[英]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
的數據,因此在為此方法構建參數時,模型綁定器將值CreatedAt
為null
。
模型綁定器不夠“足夠智能”來獲取模型的當前持久狀態並將其與來自表單的內容合並。 它只有來自形式的東西。 所以你基本上有兩個選擇:
對於第一個選項,您需要包含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.