2008-10-13 71 views
6

我有一些的LINQ to SQL,有时抛出一个如何看到在LINQ to SQL中SubmitChanges导致错误的sql?

“不能在对象'dbo.Table具有唯一索引 “IX_Indexname'.The语句已终止插入重复键行”。

有没有什么办法可以打开日志记录或至少调试到datacontext,看看在错误发生时执行的是什么sql?

更新:我应该提到我了解GetChangeSet()方法,我在想,如果有,显示了SQL的DataContext的一个属性,显示已执行的最后一个SQL,或在SQL异常属性。

关于此错误的奇怪之处在于,在更改集中只有一个更新&唯一更改的字段是不在导致错误的索引中的日期时间字段。

回答

11

一个简单的方法来做到这一点是使用DataContext.Log属性:

using (MyDataContext ctx = new MyDataContext()) 
{ 
    StringWriter sw = new StringWriter(); 
    ctx.Log = sw; 

    // execute some LINQ to SQL operations... 

    string sql = sw.ToString(); 
    // put a breakpoint here, log it to a file, etc... 
} 
+5

使用SQL事件探查器将是更好的解决方案,因为根本不需要更改代码。 – 2008-12-01 01:04:24

2

当我遇到这些类型的问题时,我一直在使用SQL分析器。基本上打开探查器,在保存/更新中放置一个断点,清除探查器,然后运行该语句。从那里我有所有执行的SQL,我可以看到生成的东西。 [我主要通过DataServices完成这项工作,因此.SaveChanges()是放置断点的非常方便的位置]

2

编写一个测试片或代码段造成所有的麻烦隔离。设置DataContext.Log = Console.Out。使用testrunner(NUnit,MSTest等)运行测试。 testrunners通常显示打印到Console.Out以及测试结果的任何内容。

1

使用SQL事件探查器。这是你的朋友,并带有SQL。您可以查看正在执行的任何SQL语句,并完全控制过滤。

0

我不得不同意Bradley Grainger使用DataContext.Log属性来查看执行的sql的最佳方式。