如果将新对象添加到 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() 永远不会返回。有没有人经历过这个?的主要内容,如果未能解决你的问题,请参考以下文章