使用Linq2SQL删除记录时出错

时间:2010-01-18 21:32:42

标签: linq-to-sql csla

我最近收到了一位客户的错误报告,并且没有解决它的运气。我希望有人能给我一些有关可能出错的信息。

错误似乎很简单:

Csla.DataPortalException:DataPortal.Delete失败(System.InvalidOperationException:Sequence在System.Linq.Enumerable.SingleOrDefault [TSource]包含多个元素(IEnumerable`1 source)

这是我的DataPortal_Delete方法,它将FileId(PK)作为参数。

private void DataPortal_Delete(SingleCriteria<File, Guid> criteria)
    {
        using (var ctx = ContextManager<Ronin.Data.RoninDataContext>
                    .GetManager(Database.ApplicationConnection, false))
        {
            var data = ctx.DataContext.Files
                    .Single(row => row.FileId == criteria.Value);

            ctx.DataContext.FileSources.DeleteAllOnSubmit(data.FileSources);

            ctx.DataContext.Files.DeleteOnSubmit(data);

            ctx.DataContext.SubmitChanges();
        }
    }

我检查的第一件事是看看是否有另一条记录具有相同的FileId(虽然是主键,但这应该是不可能的)。所有FileIds实际上都是唯一的。我启动了连接到客户端数据库的应用程序,并试图删除该记录,它没有任何问题。客户端站点的IT人员使用“问题步骤记录器”向我发送用户采取的操作的逐步屏幕截图。没有什么与众不同的,当他使用不同的机器时,他能够毫无错误地删除记录。显然,只有在Windows 7中运行应用程序时才会发生这种情况。

那就是说,有什么可能导致这个问题的想法?

3 个答案:

答案 0 :(得分:1)

假设调用Single是问题的根源,而不是:

ctx.DataContext.Files.Single(...)

更改代码以允许从该查询返回多行,然后记录返回多行时返回的内容。这应该指向您的“重复”数据问题。

要看的另一件事是在幕后生成的SQL。不确定会有所帮助,但它不会伤害。我不知道你的数据模型,所以我无法理解你的代码。

答案 1 :(得分:0)

如果它只发生在Windows 7中,那么这可能是操作系统引起的。你在Vista上尝试过吗? Vista的环境在Windows 7上是相似的。您也可以使用Windows Virtual PC + XP Mode。这是一个专为Windows 7设计的虚拟化应用程序,可让用户运行他们在Windows XP中使用的应用程序。注意:XP Mode需要支持虚拟化的处理器。

答案 2 :(得分:0)

删除一个实体时,我遇到了同样的异常。问题证明是dbml - 文件中定义的外键关系。所以这就是我案例中的例外原因。 我删除它后,它删除了记录(我不想级联删除其他表中的记录,我只需要找出如何配置linq-to-sql只是将外键列设置为null )