6

我最近收到了客户的错误报告,但没有运气解决它。我希望有人能给我一些可能是错误的见解。

错误似乎很简单:

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

这是我的 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 的记录(虽然是主键,但这应该是不可能的)。所有 FileId 实际上都是唯一的。我启动了连接到客户端数据库的应用程序并尝试删除记录,它可以正常工作。客户站点的 IT 人员使用“问题步骤记录器”向我发送用户所采取操作的逐步屏幕截图。没有什么异常,当他使用其他机器时,他能够删除记录而没有任何错误。显然,这只发生在应用程序在 Windows 7 中运行时。

也就是说,关于可能导致这种情况的任何想法?

4

3 回答 3

1

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

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

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

要查看的另一件事是在幕后生成的 SQL。不确定这会有所帮助,但它不会受到伤害。我不知道你的数据模型,所以我不能像我想的那样理解你的代码。

于 2010-01-21T13:28:31.297 回答
0

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

于 2010-02-24T06:04:55.527 回答
0

删除一个实体时我遇到了同样的异常。问题原来是在dbml-File 中定义的外键关系。所以这就是我的情况例外的原因。在我删除它可以删除记录之后(我不想级联删除另一个表中的记录,我只需要了解如何配置 linq-to-sql 以将外键列设置为 null )

于 2013-06-17T14:31:58.757 回答