2010-01-18 2 views
6

Недавно я получил сообщение об ошибке от клиента, и мне не удалась его решить. Я надеюсь, кто-то может дать мне некоторое представление о том, что может быть неправильным.Ошибка удаления записи с использованием Linq2SQL

ошибка кажется достаточно простой:

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 (хотя и является прима ry key, это должно быть невозможно). Все FileIds были действительно уникальными. Я запустил приложение, подключающееся к базе данных клиента, и попытался удалить запись, и он работал без каких-либо проблем. ИТ-парень на клиентском сайте использовал «Проблемный регистратор шагов», чтобы отправить мне пошаговые скриншоты действий, предпринятых пользователем. Ничего необычного, и когда он использовал другую машину, он смог удалить запись без каких-либо ошибок. По-видимому, это происходит только тогда, когда приложение запускается в Windows 7.

Это говорит о любых идеях относительно того, что может быть причиной этого?

+0

Файлы.FileId является основным ключом в этой таблице? –

+0

Вы уверены, что ошибка генерируется этим фрагментом кода? Ошибка ссылается на SingleOrDefault, но функция использует Single. – gfrizzle

+0

Являются ли FileSources Null? если это разные объекты, вам не нужно использовать include для их получения, прежде чем вы сможете их удалить? – awright18

ответ

1

Предполагая, что вызов Покадрового источника проблемы, вместо того, чтобы:

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

изменить код, чтобы разрешить возвращение нескольких строк из этого запроса, а затем войти, что это возвращение, когда он возвращается более один ряд. Это должно указывать на вашу проблему с «дублирующимися» данными.

Еще одна вещь, на которую стоит обратить внимание - это SQL, который создается за кулисами. Не уверен, что это поможет, но это не повредит. Я не знаю вашу модель данных, поэтому я не могу понять ваш код так же хорошо, как хотелось бы.

+0

Сообщение об исключении довольно ясно; Single принудительно выполняет тот факт, что будет возвращена только одна строка. Исключение составляют два или более. Я бы не стал менять код; простой оператор sql найдет обман: 'select fileid, count (*) из группы Files файлом с count (*)> 1' – Andy

0

Если это происходит только в Windows 7, то это может быть причиной ОС. Вы пробовали это на Vista? Среда Vista похожа на Windows 7. Также вы можете использовать Windows Virtual PC + XP Mode. Это приложение для виртуализации, специально разработанное для Windows 7, позволяющее пользователям запускать приложения, как они используются в Windows XP. Примечание. Для режима XP требуется процессор с поддержкой виртуализации.

0

У меня было то же исключение при удалении объект. Проблема оказалась внешней связью, определенной в файле dbml. Таким образом, это стало причиной исключения в моем случае. После того, как я удалил это, он удалил запись (и я не хотел, чтобы каскад удалял записи из другой таблицы, мне просто нужно выяснить, как настроить linq-to-sql, чтобы просто установить столбец внешнего ключа null)

Смежные вопросы