首页 / 知识
将LINQ调试为SQL SubmitChanges()
2023-04-16 19:05:00

Debugging LINQ to SQL SubmitChanges()我很难调试LINQ to SQL并提交更改。 我一直在使用http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx,它非常适合调试简单的查询。 我正在使用来自应用程序的以下代码段在我的项目的DataContext类中工作:
运行this.SubmitChanges;时,我会捕获一些非常奇怪的异常。
堆栈跟踪进入我无法进入的地方:
是否有人使用任何工具或技术?我是否缺少简单的东西?
编辑:
编辑2:
编辑3:
编辑4: 我总是发现对确切地知道将什么更改发送到SubmitChanges()方法中到DataContext有用。 我使用DataContext.GetChangeSet()方法,它返回一个ChangeSet对象实例,该实例包含3个只读的IList对象,这些对象已被添加,修改或移除。 您可以在SubmitChanges方法调用之前放置一个断点,并添加一个包含以下内容的Watch(或Quick Watch):
其中ctx是您的DataContext的当前实例,然后您将能够跟踪所有对SubmitChanges调用生效的更改。 首先,感谢大家的帮助,我终于找到了它。 解决方案是从项目中删除.dbml文件,添加一个空白的.dbml文件,然后使用"服务器资源管理器"中我项目所需的表重新填充该文件。 在执行此操作时,我注意到了几件事:
这只是一个理论。如果有人可以更好地解释它,我希望在这里有一个具体的答案。 我的第一个调试操作是查看生成的SQL:
第二个是捕获ChangeConflictException并查看失败的详细信息。
您可以为DataContext创建一个部分类,并使用Created或您使用的部分方法来将日志设置到console.out中,并包装在#if DEBUG中。这将帮助您查看在调试任何实例时执行的查询。您正在使用的datacontext。 我发现这在调试LINQ to SQL异常时非常有用。
这就是我所做的
您上面提到的错误通常是由指向错误方向的关联引起的。手动将关联添加到设计器中时,这很容易发生,因为与数据建模工具相比,L2S设计器中的关联箭头指向后方。 如果他们抛出一个更具描述性的例外,那就太好了,也许他们会在将来的版本中发布。 (达米恩/马特...?) 这几乎肯定不是所有人的根本原??因,但是我在项目中遇到了完全相同的异常-并发现根本原因是在构造实体类时引发了异常。奇怪的是,真正的异常是"丢失"的,而是表现为ArgumentOutOfRange异常,该异常起源于检索对象的Linq语句的迭代器。 如果收到此错误,并且在POCO上引入了OnCreated或OnLoaded方法,请尝试逐步执行这些方法。 VS 2008可以通过.NET框架进行调试(http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code .aspx) 这可能是您最好的选择,您可以看到正在发生的事情以及确切时间点的所有属性 为什么要在新实例上执行UpdateJobMaster?不应该是InsertOnSubmit吗?
一个简单的解决方案是在数据库上运行跟踪并检查针对它运行的查询-当然可以过滤掉其他应用程序等,以访问数据库。 当然,这只有在您克服了例外之后才有帮助。 检查dbml中的所有"主键"列是否确实与数据库表上的主键相关。我只是遇到一种情况,设计人员决定在dbml中添加一个额外的PK列,这意味着LINQ to SQL在保存时找不到外键的两面。 嗯 以WAG(Wild Ass Guess)为例,在我看来像LINQ-SQL试图以某种方式基于JobMaster类的创建来查找ID不存在的对象。是否有与该表相关的外键,以便LINQ to SQL会尝试获取可能不存在的类的实例?您似乎正在将新对象的ProjectID设置为字符串-您是否真的有一个字符串ID?如果您尝试将其设置为新项目,则需要创建一个新项目并获取其ID。 最后,UpdateJobMaster是做什么的?可以做一些上述事情适用的事情吗? 我今天早些时候在这里发布了一个类似的问题:奇怪的LINQ异常(索引超出范围)。 这是一个不同的用例-该错误在SubmitChanges()期间发生,我的错误在简单查询期间发生,但它也是索引超出范围的错误。 如果问题中的数据组合有助于撒马利亚人很好地回答,则在此问题中交叉发布:) 这是很久以前的事了,但是我遇到了同样的问题,错误是由于带有select语句的触发器引起的。 就像是
当linq-to-sql运行update命令时,它还会运行select语句以在同一查询中接收自动生成的值,并期望第一个记录集包含"要求"列,但在这种情况下,第一行是 触发器中的select语句中的列。 所以linq-to-sql期望有两个自动生成的列,但是它只接收到一个列(数据错误),这导致了此异常。 我最近遇到了同样的问题:我所做的是
代替:
上下文显然是DataContext对象,"单元"是Unit对象的实例,Unit对象是dbml文件中的数据类。 接下来,我使用" proce"对象在另一个"数据类"对象的实例中设置属性。 LINQ引擎可能无法检查INSQ命令是否允许我在" proce"对象中设置的属性,而INSERT命令必须由LINQ创建,以将另一个"数据类"对象添加到数据库中。 我有同样的非说话错误。
我与表的列有外键关系,该表不是表的主键,而是唯一的列。 希望这对任何人有帮助! 在对SO#237415的答复中发布了我的例外情况经验 当尝试调试LINQ ChangeConflictException时,我遇到了这个问题。最后,我意识到问题是我在DBML文件中的表中手动添加了一个属性,但是我忘记设置诸如Nullable(在我的情况下应该为真)和Server Data Type之类的属性。 希望这对某人有帮助。 实际上,我们已经停止对大型项目使用Linq to SQL设计器,而这个问题是主要原因之一。我们还更改了许多默认的名称,数据类型和关系默认值,设计人员有时会丢失这些更改。我从来没有找到确切的原因,也无法可靠地复制它。 那,连同其他限制,导致我们放弃了设计师并手工设计课程。在习惯了模式之后,实际上比使用设计器要容易。 |
最新内容
相关内容
linux更改硬盘命令?
linux更改硬盘命令?,系统,工具,电脑,号码,管理,名称,分区,首次,数据,环境,在LINUX系统中,分区与格式化硬盘的命令是什么?1、fdisk/sfdisk:命令linux提交程序命令行?
linux提交程序命令行?,工作,系统,信息,地址,工程,目录,管理,环境,命令,功能,Linux系统常用操作命令有哪些linux常用命令: pwd命令 该命令的英linux密码更改命令?
linux密码更改命令?,密码,系统,名称,信息,环境,命令,使用者,用户,权限,终端,Linux修改用户密码的命令是命令:passwd [-k] [-l] [-u [-f]] [-d]linux更改扩展命令?
linux更改扩展命令?,管理,地址,数据,工作,系统,在线,工具,命令,环境,单位,Linux命令有哪些1、linux常用命令如下:查看内核版本:uname-a。控制台-更改linux命令行名字?
更改linux命令行名字?,系统,名字,命令,文件,用户,文件名,用户名,用户组,终端,前面,在linux中怎么修改文件名?Linux重命名文件是rename。Linuxlinux命令别名的更改?
linux命令别名的更改?,系统,别名,新增,环境,地方,命令,查询系统,名字,主机名,文件,linux系统怎样设置命令别名1、可将设置别名的命令写进启动linux命令更改用户?
linux命令更改用户?,系统,密码,管理,用户,命令,环境,工作,地址,电脑,文件,linux如何更改用户名?1、首先打开linux的终端,输入指令修改用户名,简linux更改uid命令?
linux更改uid命令?,系统,信息,管理,工作,密码,用户,设备,数字,名称,命令,linux显示文件所属用户为数字怎么调整为显示用户名1、linux怎么修改更改时间linux命令?
更改时间linux命令?,时间,系统,命令,环境,网上,信息,资料,概念,位置,终端,linux修改时间命令setdate(linux修改时间命令没权限)1、只修改日期,linux命令行更改中文?
linux命令行更改中文?,系统,环境,管理,国家,信息,软件,文化,设备,中文,命令,linux命令行下怎样改变语言(英文)将内容改为:LANG=zh_CN.UTF-8LANGlinux更改账户名命令?
linux更改账户名命令?,密码,系统,代码,命令,基础,信息,软件,用户,用户名,账户,linux切换用户命令linux切换用户的命令是“su”。普通用户之间linux更改uid命令?
linux更改uid命令?,系统,信息,管理,工作,密码,用户,设备,数字,名称,命令,linux显示文件所属用户为数字怎么调整为显示用户名1、linux怎么修改