c# - ASP.NET MVC3 代码优先错误 - 尝试更新实体

标签 c# asp.net asp.net-mvc-3 sql-server-ce

我检查过 this question似乎和我需要的有关,但没有准确回答。

我有一个实体(通过 MVC3 使用 EF Code First 的 Sql Compact - 如果从标题中不清楚)用于“问题”(一般问题跟踪,仅用于我自己对 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 数据类型转换为 datetime 数据类型等,等等)

当我逐步执行代码时,我的 CreatedBy 和 CreatedDate 属性似乎未包含在 Controller 传递的 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]) 并将编辑器添加到 View 中。这对我来说似乎有点愚蠢和迂回,但它确实可以工作,而无需添加自定义代码来分离一个对象并替换更新的对象。

最佳答案

简短的回答是,您已经使用 Find 将实体加载到上下文中,以后不能附加另一个实体。

你有两个选择:

  • 分离第一个实例,然后附加第二个
  • 将字段从第二个实例复制到第一个

我将分享第一个选项的代码。首先,将 Detach 方法添加到您的 DbContext 实现中:

public void Detach(object entity)
{
    var objectContext = ((IObjectContextAdapter)this).ObjectContext;
    objectContext.Detach(entity);
}

然后调用Detach而不是将变量设置为null

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.Detach(startingIssue);

    db.Entry(issue).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Index");
}

关于c# - ASP.NET MVC3 代码优先错误 - 尝试更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022346/

相关文章:

c# - ASP.Net web api 后操作参数总是为空

c# - 如何让我的控制台窗口停止让我在 Visual Studio 中输入回车?

c# - 在按钮中添加 OnClientClick 时必填字段验证器不起作用

c# - View 状态键的长度会影响 View 状态的大小吗?

asp.net - 将 IoC 依赖注入(inject)自定义 HTTP 模块 - 如何? (ASP.NET)

c# - 将值添加到存储在 session 中的列表,然后用作转发器的数据源

c# - 如何在不重复 if/else 代码的情况下使用 ASP.NET Core 基于资源的授权

c# - 如何修改通过 C# 代理传递的 RTSP 数据

css - 根据页面激活导航项

asp.net-mvc-3 - MVC3 编辑器只读