我最近收到了一位客户的错误报告,并且没有解决它的运气。我希望有人能给我一些有关可能出错的信息。
错误似乎很简单:
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中运行应用程序时才会发生这种情况。
那就是说,有什么可能导致这个问题的想法?
答案 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 )