加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – DBContext,状态和原始值

发布时间:2020-12-16 09:49:36 所属栏目:asp.Net 来源:网络整理
导读:我正在使用EF和Code First使用ASP.NET MVC3. 我正在为练习编写一个简单的问题跟踪器.在我的控制器中,我有一个相当标准的代码: [HttpPost]public ActionResult Edit(Issue issue) { if (ModelState.IsValid) { dbContext.Entry(issue).State = EntityState.M
我正在使用EF和Code First使用ASP.NET MVC3.

我正在为练习编写一个简单的问题跟踪器.在我的控制器中,我有一个相当标准的代码:

[HttpPost]
public ActionResult Edit(Issue issue) {
    if (ModelState.IsValid) {
        dbContext.Entry(issue).State = EntityState.Modified
        .....
    }
}

问题第1部分
我试图了解dbcontext的工作原理 –
在我在dbContext.Entry(问题)上设置State之前,我假设我的问题对象是分离的.一旦我设置了要修改的状态,就会附加对象 – 但是对于什么? dbContext还是数据库?我有点想念这个(附加)实际意味着什么?

问题第2部分
为了论证,让我说我决定在我的问题上设置“已接受”字段.接受是一个布尔值.我从错误开始,我在表单中将其设置为true并提交.在附加我的对象时,OriginalValues集合的重点是什么?例如,如果我在设置EntityState.Modified之后设置断点但在调用SaveChanges()之前我可以查询

db.Entry(issue).OriginalValues["Accepted"]

这将给我与简单查询已传入Edit …的问题对象相同的价值.它给出了相同的结果

issue.Accepted

我明显遗漏了一些东西,因为文档说
“原始值通常是实体的属性值,就像上次从数据库中查询时一样.”
但事实并非如此,因为数据库仍然报告Accepted为false(是的,我在文档中注意到“通常”这个词,但我的代码几乎都是由MS代码生成的标准所以……).
那么,我错过了什么?这里到底发生了什么?

解决方法

上下文仅适用于附加实体.附加意味着上下文了解实体,它可以保留其数据,在某些情况下,它可以提供更改跟踪或延迟加载等高级功能.

默认情况下,上下文实例从数据库加载的所有实体都附加到该实例.对于Web应用程序和其他断开连接的方案,您为每个已处理的HTTP请求都有一个新的上下文实例(如果不这样做,则表示您犯了一个大错误).此外,您在HTTP POST中由模型绑定器创建的实体也不会被该上下文加载 – 它已被分离.如果要保留该实体,则必须附加该实体并通知上下文您所做的更改.将状态设置为Entry to Modified将执行两个操作 – 它将实体附加到上下文并将其全局状态设置为Modified,这意味着在调用SaveChanges时将更新所有标量和复杂属性.

因此,通过将状态设置为已修改,您已将实体附加到上下文,但在调用SaveChanges之前,它不会影响您的数据库.

OriginalValues在完全附加的场景中非常有用,在这些场景中,您从数据库加载实体并对该附加实体进行更改.在这种情况下,OriginalValues显示从数据库加载的属性值,而CurrentValues显示应用程序设置的实际值.在您的场景中,上下文不知道原始值.它认为原始值是您附加实体时使用的值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读