我有一些LINQ to SQL,它有时会抛出
"无法在具有唯一索引的对象"dbo.Table"中插入重复的键行"IX_Indexname"。该语句已终止。"
有没有什么方法可以打开日志记录,或者至少调试到数据上下文中,以查看在出现错误时正在执行什么sql?
更新:我应该提到我知道GetChangeSet()
方法,我想知道DataContext上是否有显示上次执行的SQL的属性,或者SQL异常上是否有表示SQL的属性。
这个错误的奇怪之处在于,在变更集中,只有一个更新&唯一正在更改的字段是导致错误的索引中没有的日期时间字段。
一个简单的方法是使用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语句发送到服务器之前查看它。
最后一点是使用VS2008通过.NET框架进行调试的能力。
使用SQL事件探查器。它是您的朋友,附带SQL。您可以查看正在执行的任何SQL语句,并完全控制筛选。
我同意Bradley Grainger使用DataContext。Log属性是查看执行的sql的最佳方式。