我在更新商品时遇到问题。创建新项目时,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;
}
有没有我错过的东西?
答案 0 :(得分:1)
您应该使用EntityState检查Entry是否已修改:
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();
}
答案 1 :(得分:1)
在这种方法中:
public void UpdateItem(ItemViewModel viewModel)
{
item.UpdatedBy = WebSecurity.CurrentUserName;
item.UpdatedAt = DateTime.Now;
db.SaveChanges();
}
viewModel
来自哪里? (并且,想一想,什么是item
?)这是一个客户端表单调用的动作吗?我怀疑这里发生的是客户端表单不包含CreatedAt
的数据,因此模型绑定器在为此构建参数时将值保留为null
方法
模型装订器不够聪明"获取模型的当前持久状态并将其与表单中的内容合并。 只有来自表单。所以你基本上有两个选择:
对于第一个选项,您需要包含CreatedAt
。这可能是一件简单的事情:
@Html.HiddenFor(model => model.CreatedAt)
答案 2 :(得分:0)
试试这个
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();