Ошибка удаления записи с использованием Linq2SQL - PullRequest
6 голосов
/ 19 января 2010

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

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

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

Тем не менее, есть идеи относительно того, что может быть причиной этого?

Ответы [ 3 ]

1 голос
/ 21 января 2010

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

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

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

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

0 голосов
/ 17 июня 2013

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

0 голосов
/ 24 февраля 2010

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

...