我检查了this question,它似乎与我所需要的有关,但并未完全回答它。ASP.NET MVC3代码优先错误 - 尝试更新实体
我有一个实体(Sql Compact,使用EF Code First,通过MVC3--如果标题中没有明确的话),用于“Issue”(通用问题跟踪,仅用于我自己对MVC3工作原理的理解)。 Issue类有一个CreatedBy属性(Int引用创建问题的用户)和一个CreatedDate属性(DateTime)。当我使用脚手架代码来更新(仅修改,以防止某些更新的日期字段从被用户修改):
if (ModelState.IsValid)
{
issue.LastActivity = (DateTime?)DateTime.Now.Date;
if (issue.ClosedBy != null) issue.ClosedDate = (DateTime?)DateTime.Now.Date;
startingIssue = null;
db.Entry(issue).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
我接收在链接的问题中提到一个DATETIME2数据类型的(转换到错误日期时间数据类型等等)
当我逐句通过代码时,看起来我的CreatedBy和CreatedDate属性不包含在控制器正在传递的issue
实例中。当我尝试通过从DB抓住了问题的另一个副本,并更新那些值来解决这个问题:
var startingIssue = db.Issues.Find(issue.IssueId);
if (ModelState.IsValid)
{
if (issue.CreatedBy != startingIssue.CreatedBy) issue.CreatedBy = startingIssue.CreatedBy;
if (issue.CreatedDate != startingIssue.CreatedDate) issue.CreatedDate = startingIssue.CreatedDate;
issue.LastActivity = (DateTime?)DateTime.Now.Date;
if (issue.ClosedBy != null) issue.ClosedDate = (DateTime?)DateTime.Now.Date;
startingIssue = null;
db.Entry(issue).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
我得到的并发冲突:具有相同键的对象已经存在于ObjectStateManager。 ObjectStateManager不能使用同一个键跟踪多个对象。
那么,如何在不违反并发的情况下,如何让EF查看已经在数据库中设置的日期(因此它不会尝试将CreatedDate更新为1/1/0001)?
编辑 好的...我找到了。显然,我在寻找@Html.HiddenFor(model => model.[property])
,并将编辑器添加到视图中。这对我来说似乎有点愚蠢,但它的确行得通,无需添加自定义代码来分离一个对象并替换更新的对象。
这是有效的。谢谢。我会等待看看是否有其他人碰巧提供了更优雅的解决方案,但是如果没有,我会选择你的答案作为接受的答案。 – AllenG 2011-05-16 19:53:33
看到我的更新 - 无论如何给你点。 – AllenG 2011-05-16 21:00:27
我有类似的问题。我在创建新记录时需要设置我的表(CreatedBy,CreatedOn)上的审计字段,但我不想传递它们以在我的MVC网站上编辑页面。因此,在编辑新记录时,我必须从DB读取当前审计值,然后在将其保存到DBContext之前更新传入对象。要做到这一点,我需要找到(id),抓住当前值,然后分离。我的问题/答案在这里http://stackoverflow.com/questions/8145635/what-is-the-best-way-to-maintain-an-entitys-original-properties-when-they-are-n/8154045# 8154045 – kingdango 2011-11-16 15:27:56