DeleteObject(...)/ SaveChanges()之后的数据库错误

时间:2013-08-31 06:38:00

标签: c# asp.net sql-server entity-framework

上下文:Web应用程序/ ASP.NET 4.0 / EF 4.0 / MSSQLEXPRESS2012

我正在尝试按如下方式进行简单删除:

if (someObject != null)
{
    if (!context.IsAttached(someObject))
       context.SomeObjects.Attach(someObject);

    context.DeleteObject(someObject);
    context.SaveChanges();
}

代码执行没有问题,SaveChanges返回预期的行数。但是当我尝试读取表格之后它会超时(这发生在mssms和代码中)。

它似乎也破坏了其他进程,在后续站点访问时返回“服务器上的8501 MSDTC不可用”和“管道另一端没有进程”。应用程序中发生的三个错误中的哪一个似乎有点随机,但总是会发生mssms中的超时。

同一个表上的插入和更新执行没有问题。

除了阅读大量帖子之外,我还尝试将其包装在try / catch和事务中,使用SaveChanges(System.Data.Objects.SaveOptions.None)和手动AcceptAllChanges;调试器在删除之前显示正确的对象 - 在表读取或访问另一页之前,所有内容都显示正常。

我怀疑锁不会被释放,但是不同表中的其他对象使用完全相同的逻辑成功删除。我不确定下一步哪个好看 - 任何想法都非常适合!

1 个答案:

答案 0 :(得分:0)

之前必须在交易中出错 - 以下工作:

var transactionScope = new TransactionScope
                                    (TransactionScopeOption.RequiresNew, 
                                        new TransactionOptions()
                                        {
                                            IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
                                        }
                                    );
        try
        {
            using (transactionScope)
            { ...etc

以下链接详细介绍了显式交易的原因 http://blogs.u2u.be/diederik/post/2010/06/29/Transactions-and-Connections-in-Entity-Framework-40.aspx

仍然不确定为什么它在没有交易的情况下工作,但其他删除