Linq2SQL在控制台应用程序上工作,但不能在Windows服务上工作
本文关键字:工作 但不能 Windows 服务 程序上 控制台 应用 应用程序 Linq2SQL | 更新日期: 2023-09-27 18:03:37
选择正确的标题很困难,但问题是:
我有一个具有简单逻辑的应用程序,从TFS获取数据,迭代"项目"并使用这些"项目"更新本地DB。下面是更新行的代码片段:
using (ResultDBDataContext local_db= new ResultDBDataContext())
{
DBTestResult dbRes = local_db.DBTestResults.getByPrimaryKey(args_supplied);
if (dbRes == null) {
dbRes = new DBTestResult(){//set properties}
local_db.DBTestResults.InsertOnSubmit(dbRes);
}
else{
dbRes.isDirty = true;
dbRes.otherPropertis = set_to_some_values;
}
local_db.SubmitChanges();
}
这在Windows控制台程序中工作(像这样导入>100K行),这证明逻辑是正确的。但是当我把相同的逻辑Windows服务(对相同的数据),过了一会儿(<2K行)我得到一个SQL异常说"不能插入重复键到表"。注意,我在更新/插入每一行
之后执行SubmitChanges()我认为这与以下因素有关,但无法找出原因:
- Windows服务如何处理数据库连接。(他们会合伙吗?它们缓存数据吗?等) Linq2SQL数据上下文处理它的更新对象。(Linq2SQL数据上下文的哪些属性使其在Windows服务下的行为不同?)
任何想法/建议/链接/教程/文章如何解决这个问题或找到更多的信息,非常欢迎。
谢谢。
Update:来自TFS的数据可能违反数据库的主键约束-但由于我每次插入/更新一行并提交更改,因此同一主键的最后一个条目将驻留在数据库中。
任何想法/建议/链接/教程/文章如何解决这个问题或找到更多的信息,非常欢迎。
这听起来像是代码的服务端没有问题。
我认为你需要进一步记录/检查这个错误行为-只是尝试记录哪个主键发生了这种情况-可能你会注意到一些错误在你的getByPrimaryKey实现的方式。
还要检查你的服务是单线程的-即不能有两个实例同时执行-这肯定会导致错误。
是什么触发你的服务开始它的操作?听起来你的进程正在运行第二次,这导致你的数据被处理两次,而不是一次,当它作为一个控制台应用程序运行时。
例如,如果您正在使用FileSystemWatcher让您知道新文件何时到达要处理的位置,则该监视器将在文件创建和添加(更新)时触发多个事件。