【发布时间】:2011-05-16 19:29:58
【问题描述】:
我检查了this question,它似乎与我的需要有关,但没有准确回答。
我有一个实体(Sql Compact using EF Code First via MVC3-如果标题中不清楚的话)用于“问题”(一般问题跟踪,仅用于我自己对 MVC3 工作原理的教育理解)。问题类具有 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 数据类型转换为 datetime 数据类型等)
当我单步执行代码时,我的 CreatedBy 和 CreatedDate 属性似乎不包含在控制器正在传递的 issue 的实例中。当我尝试通过从数据库中获取问题的另一个副本并将其更新为值来解决此问题时:
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]) 并将编辑器添加到视图中。这对我来说似乎有点愚蠢和迂回,但它确实可以工作,而无需添加自定义代码来分离一个对象并替换一个更新的对象。
【问题讨论】:
标签: c# asp.net asp.net-mvc-3 sql-server-ce