如果将新对象添加到 ObjectSet,则 ObjectContext.SaveChanges() 永远不会返回。有没有人经历过这个?

Posted

技术标签:

【中文标题】如果将新对象添加到 ObjectSet,则 ObjectContext.SaveChanges() 永远不会返回。有没有人经历过这个?【英文标题】:ObjectContext.SaveChanges() never returns if new object added to an ObjectSet. Has anyone experienced this? 【发布时间】:2012-12-16 03:15:18 【问题描述】:

我有一个名为 UnitHistoryEntities 的 EF4 EDM。数据库存储在 SQL Express 2012 中。Windows 7 64 位。

    我使用context = new UnitHistoryEntities() 创建了一个新上下文。 我将此上下文传递到几个对话框中,这些对话框会从用户那里收集一些信息。在此期间可能执行了一些查询。 基于该输入,我使用var unit = new Unit() 构造一个新的 Unit 实体,设置一些属性,然后使用context.Units.AddObject(unit) 将其添加到上下文中 然后我打电话给context.SaveChanges()

SaveChanges() 的调用永远不会返回(我已经给了它至少 10 分钟)并且永远不会引发异常。如果我删除AddObject(),它会返回而不对数据库进行任何更改,因为没有任何修改。

为什么SaveChanges() 永远不会返回?有人遇到过这种现象吗?

当我的程序处于这种状态时,我能够从 SQL Management Studio 连接并在数据库上执行查询。

【问题讨论】:

Never, ever?你怎么知道的?你给它多久了? 至少 10 分钟。应该有足够的时间让事情发生。我的数据库目前几乎是空的。查询正在发生,所以我知道连通性很好。下一条语句是MessageBox.Show(),我在那里设置了一个永远不会被击中的断点。跨步(或介入)永远不会做任何事情。 我不认为数据库被锁定了?您能否在程序挂起时查询数据库? 好主意。是的,我刚试过。我能够连接 SQL Server Management Studio 并查询所涉及的表。 SQL Express 2012。 【参考方案1】:

实体它的功能是添加到表中,每个表都有一个名为自己的函数 ,您可以使用Entity将以下内容添加到数据库中:

UnitHistoryEntities context=new UnitHistoryEntities();
Unit unit=new Unit();
unit.field1=value1;
unit.field2=value2;
context.AddtoUnit(unit);
context.SaveChange();

【讨论】:

试过了。不用找了。我将提炼出导致此问题的最少代码,并发布带有代码和模型的更新。【参考方案2】:

原来我遇到的问题与this question 非常相似。我有一个没有设置的 DateTime 字段。我制作了一个控制台应用程序,它在我的应用程序正在执行的上下文中执行完全相同的操作。在这种情况下,SaveChanges()确实返回,The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated.

除外

因此,我现在将 DateTime 字段设置为 1/1/1900,并将其视为空日期。我的程序现在可以正常运行了。

奇怪的是,我的 WPF 应用程序中没有抛出异常,但我在控制台应用程序中却抛出了异常......

【讨论】:

【参考方案3】:

这是因为 EF 在您尝试插入的数据上抛出了 DbEntityValidationException。如果 EF 抑制错误,您可以使用记录查询和错误。

context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

【讨论】:

以上是关于如果将新对象添加到 ObjectSet,则 ObjectContext.SaveChanges() 永远不会返回。有没有人经历过这个?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 将 Include 动态添加到 ObjectSet<Entity>?

将新文档添加到现有集群中

如何将新的字符串元素添加到字符串系列

将新对象添加到域数据源

将新时隙添加到时隙表

中断for循环后如何重置指针