问题标签 [objectstatemanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4461 浏览

c# - 为什么实体框架会检测已修改但重置的属性的更改?

如果我修改了 POCO 实体的属性,但将其重置,EntityFramework 仍然会说有更改。

已修改的条目:

你如何处理这个案子?

0 投票
1 回答
80 浏览

.net - 为什么我将引用的实体添加到上下文而不是附加的、未更改的?

我已将实体附加到上下文中EntityState.Unchanged,稍后我通过DbContext<T>.Add(). Add()添加实体,但它还将它引用的其他实体添加到添加的集合中ObjectStateManager,尽管引用的实体之前在未更改集合中。在调试器下,我看到两个集合中的引用实体。因此,当我不希望它们发生时,我最终会在引用的子实体上进行插入。

0 投票
1 回答
334 浏览

entity-framework - EF4 ObjectStateManager 不报告更改?

我正在尝试使用 EF4(数据库优先)在上下文级别实现更改审计系统。我正在覆盖SaveChanges和捕获状态为AddedDeletedModified来自上下文的ObjectStateManager. 这通常有效,但我遇到了一个问题,即没有一个实体具有这种状态(包括我在代码中更改的实体),但上下文确实对数据库进行了更改。我已经查看Unchanged了状态为状态的条目列表,而我修改后的实体在该列表中。

我能看到的唯一复杂情况是我正在使用自我跟踪实体(因为这是一个 WCF 服务,通常将这些 STE 发送到客户端进行更改,然后客户端将修改后的 STE 备份以保持更改) . 似乎正在发生的事情是在服务器上检索并直接在那里修改(而不是传递给客户端并使用 STE ObjectChangeTracker)的对象没有被标记为Modified. 这是正常/预期的行为吗?如果是这种情况,那么显然上下文正在使用除 之外的其他ObjectStateManager内容来确定哪些更改要持久保存到数据库,因为正在进行更改。

如何检测这些变化并跟踪它们?有谁知道上下文用于跟踪更改的是什么?我一直认为它是ObjectStateManager,但似乎并非如此。

0 投票
2 回答
869 浏览

entity-framework - 实体框架更新现有对象

我在我的数据库中添加了一行,并返回一个不同的上下文来更新它。我有这堂课:

C 可能是一个 EntityObject,但这个类不知道这一点。

我的保存看起来像这样:

等等...

在我的测试用例中,TryGetObjectStateEntry 找不到 stateEntry。然而,它是一个 EntityObject,并且它不是新的(IsNew 是我的标志),所以它会到达 else。这是我的问题: set.Attach 抛出此错误

“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”

下一刻,ApplyCurrentValues 抛出这个:

“在 ObjectStateManager 中找不到键与所提供对象的键匹配的对象。验证所提供对象的键值是否与必须应用更改的对象的键值匹配。”

这两者怎么可能是真的?

更多信息:

_item 是由 Get 在另一个上下文中创建的。然后处理了该上下文。那时,_item 有一个 EntityState.Unchanged。我对其进行了一些更改,并将其更改为 EntityState.Modified。(我没想到,因为上下文(及其 ObjectStateManager)应该已经消失了。)无论如何,一旦它到达 Save(上面),它的状态(由调试器报告)被修改,但我有到那时一个新的背景。如果此时我得到所有 ObjectStateEntries(已添加、已删除、已修改、未更改)的列表,则只有两个,并且 _item 不是其中之一,正如 ApplyCurrentValues 报告的那样,但它无法附加,因为“它是也在那儿!”。也许问题在于它仍然附加到旧的 ObjectStateManager (可能有一些不会让 ObjectStateManager 处理的引用?)。

0 投票
2 回答
3271 浏览

c# - 添加第二个数据时出现 ObjectStateManager 错误(实体框架)

当我添加多个连续数据时,SaveChanges() 方法中发生错误。

异常 对数据库的更改已成功提交,但在更新对象上下文时发生错误。ObjectContext 可能处于不一致的状态。内部异常消息:AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 AcceptChanges 之前确保键值是唯一的。

我的基础服务

0 投票
0 回答
620 浏览

entity-framework - 使用 Entity Framework 的 ChangeTracker 处理复杂的属性

我会尽量在这篇文章中尽可能地描述。我已经阅读了十几个与我的问题外围相关的 SO 问题,但到目前为止,没有一个与正在发生的事情相匹配。

因此,为了对我们的数据库事务(创建、更新、删除)执行审计日志记录,我们的设计使用了 IAuditable 接口,如下所示:

这三个上下文 ID 与域模型的布局方式有关,如前所述,它们中的一些或全部可能为空,具体取决于被审计的实体(它们用于过滤目的,以便管理员只想查看应用程序特定范围的审核日志)。任何需要对 CUD 操作进行审计的模型只需要实现这个接口。

审计表本身的填充方式是通过位于基本 DbContext 和我们域的上下文之间的 AuditableContext。它包含审计表 DbSets,并使用 EF ChangeTracker 覆盖 SaveChanges 方法,如下所示:

“制作审计记录”过程是一段稍微复杂的代码,它使用反射和其他有趣的东西来提取需要审计的字段(可审计模型有一些方法可以让它们的一些字段“退出”审计)以及所有这些。

所以这个逻辑很好。当我有这样的可审计模型时,问题就来了:

正如所指出的,在大多数情况下,这些上下文审计字段只是模型的标准属性。但是在某些情况下,例如这里,需要从虚拟复杂属性中提取上下文 id。

这最终导致NullReferenceException尝试从 SaveChanges() 方法中获取该属性时 - 它表示虚拟 Bar 属性不存在。我已经阅读了一些有关如何构建 ChangeTracker 以允许延迟加载复杂属性的信息,但我找不到正确的语法。“原始值”列表中不存在这些字段,并且对象状态管理器没有这些字段,我猜是因为它们来自接口而不是直接被审计的实体。

那么有谁知道如何解决这个奇怪的问题?我可以强制急切加载整个对象,包括虚拟属性,而不是显然很顽固的延迟加载吗?

很抱歉这篇冗长的帖子,我觉得这是一个非常具体的问题,可能需要详细信息。

蒂亚!:)

0 投票
1 回答
1280 浏览

entity-framework - 乐观并发异常由用户代码处理

我将 MVC4 与 Entity Framework 4.1 一起使用。

最初,我们从数据库创建了一个 Ado.net 实体模型。在 .edmx 文件中,数据库中的某些表不可见,因为它们不具有特定表的主键。

随着我们的项目向前推进,我们需要更新到其中一个没有主键字段的日志表。

因此,我们修改了 .edmx 文件,而不是在数据库中进行修改。我们的客户要求我们不要修改数据库字段。我们已经修改了 .edmx 并在表中的一个现有字段(比如tbl_log表)上创建了一个 pk。

我们正在尝试更新 tbl_log。但它给出了一条错误消息Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

我在堆栈溢出中看到了很多问题,也搜索了一下,但找不到任何解决方案。

即使我尝试刷新 ObjectStateManager 条目,但它仍然指向相同的错误。

这是我的代码

请帮忙

谢谢,

卡尔提克

0 投票
1 回答
832 浏览

asp.net-mvc-3 - objectstatemanager 中已存在具有相同键的对象

关于这个错误有很多问题,但我无法弄清楚我的问题(也许我需要更多关于这个的理论)。

我遇到了“objectstatemanager 中已经存在具有相同键的对象”错误,而我尝试做的事情非常简单,我只有一个用于客户端的编辑视图,它有一个电话列表。当用户点击 Save 按钮时,我只需使用 Json 包装所有内容并使用 Ajax 将其发送到控制器。

在控制器上,我应该检查发送列表中的哪些电话我应该更新,作为新闻插入并删除。

所以这是代码的重要部分(以及引发上述异常的部分):

有什么帮助或建议吗?

更糟糕的是:我把抛出异常的那一行去掉,只是为了测试代码的其余部分,在 SaveChanges 之前的最后一行,它抛出了另一个异常:

更新:

我设法解决了以另一种形式重写上述例程的部分问题,如下所示:

现在剩下的唯一问题是删除一个 Proprietario 实例(因为它有一个 TelefoneProprietario 列表,并且 TelefoneProprietario 有一个对拥有它的 Proprietario 的引用。这种情况导致“两个对象之间的关系无法定义,因为它们附加到不同的 ObjectContext 对象”,正如在 SO 中广泛讨论的那样......试图找出解决方案,所以如果你能指出我的东西......)

0 投票
1 回答
332 浏览

entity-framework - 如何不止一次地找出 ObjectStateManager 中的实体

嗨,我收到以下错误:

AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 AcceptChanges 之前确保键值是唯一的。

现在我正在尝试修复它,但我需要查明是什么实体给我带来了麻烦,所以我知道去哪里找。

我知道错误是什么并且我知道如何解决它,但我不知道如何找出哪个实体是双重的。

0 投票
3 回答
13245 浏览

c# - 实体条目的意外 GetType() 结果

当我遍历ObjectStateEntries我期望的[t]变量名时MY_ENTITY

但真实的我有

如何确定可以将当前条目转换为MY_ENTITY类型?