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

标签 asp.net-mvc-3 entity-framework-4.1 ef-code-first

我正在使用 EF 和 Code First 处理 ASP.NET MVC3。

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

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

问题第 1 部分
我试图弄清楚 dbcontext 是如何工作的 -
在我在 dbContext.Entry(issue) 上设置状态之前,我假设我的问题对象是分离的。一旦我设置了要修改的状态,对象就会被附加——但是附加到什么? dbContext 还是数据库?我有点想念这个(附加)实际上意味着什么?

问题第 2 部分
为了论证,假设我决定在我的问题上设置“已接受”字段。接受是一个 bool 值。我从它是假的开始,我在表单中将它设置为真并提交。在附加我的对象时,OriginalValues 集合的意义是什么?例如,如果我在设置 EntityState.Modified 之后但在调用 SaveChanges() 之前设置断点,我可以查询
db.Entry(issue).OriginalValues["Accepted"]

这将为我提供与简单查询已传递给编辑的问题对象相同的值......即它给出的结果与
issue.Accepted

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

最佳答案

上下文只能与附加实体一起使用。附加意味着上下文知道实体,它可以保留其数据,并且在某些情况下它可以提供高级功能,如更改跟踪或延迟加载。

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

因此,通过将状态设置为 Modified您已将实体附加到上下文,但直到您调用 SaveChanges它不会影响您的数据库。
OriginalValues在从数据库加载实体并更改该附加实体的完全附加方案中最有用。在这种情况下 OriginalValues显示从数据库和 CurrentValues 加载的属性值显示您的应用程序设置的实际值。在您的场景中,上下文不知道原始值。它认为原始值是您附加实体时使用的值。

关于asp.net-mvc-3 - DBContext、状态和原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7512636/

相关文章:

c# - 使用 Entity Framework 进行 LIKE 查询

entity-framework - 实体对象用于新添加的对象而不是动态代理 Entity Framework

entity-framework - Entity Framework - 它是否适合企业级应用程序?

sql-server - SQL Server 中的 C# float 转实数

asp.net-mvc-3 - ELMAH 应用程序名称 : show exceptions logged by another site

c# - 使用 T4MVC 在 RedirectToAction() 中传递一个对象

entity-framework-4 - Entity Framework 4 - 在持久性未知上下文中使用 CTP5(代码优先)映射非公共(public)属性

entity-framework - Entity Framework 代码第一次迁移抛出错误

c# - 是否可以在 Linq 的 1 个 join 语句中添加多个 'on'

asp.net-mvc-3 - Ninject MVC 3 - 将依赖项注入(inject)模型和 Controller