你怎么看到在LINQ to SQL中的SubmitChanges上导致错误的sql?

我有一些LINQ to SQL,有时会抛出一个

“无法在对象’dbo.Table’中插入具有唯一索引’IX_Indexname’的重复键行。该语句已被终止。”

有没有什么方法可以打开日志记录或至少调试到datacontext,以查看在引发错误时正在执行的SQL?

更新:我应该提到我知道GetChangeSet()方法,我想知道DataContext上是否有一个属性显示最后执行的SQL,或者是显示SQL的sqlexception的属性。

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

一个简单的方法是使用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... } 

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

编写测试以隔离导致所有问题的一段或多块代码。 设置DataContext.Log = Console.Out。 使用testrunner(NUnit,MSTest等)运行测试。 测试人员通常会显示打印到Console.Out的任何内容以及测试结果。

您可以使用SQL事件探查器查看SQL,因为它正在访问SQL服务器。

如果您想查看更改集中的实际内容,您需要使用:

 context.GetChangedSet(); 

MSDN – http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.getchangeset.aspx

然后,您可以在将每个SQL语句发送到服务器之前查看它们。

您的最后一点是使用VS 2008通过.NET框架进行调试的能力。

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

我必须同意Bradley Grainger使用DataContext.Log属性是查看执行的sql的最佳方法。