Строка Linq to SQL Not Found или измененное исключение при операции вставки Ajax Postback в MVC3 - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть MVC3 View, который отправляет набор входных значений через Ajax на мой контроллер. Мой контроллер затем создает новый объект FieldTripRoute в моем контексте и пытается вставить его в базу данных.

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

Трассировка стека для исключения выглядит следующим образом:

   at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges()
   at ManageMAT.Controllers.FieldTripController.RouteAdd(Int32 id, FormCollection collection) 

Это код, который вызывается для добавления нового объекта Route из контроллера:

        [HttpPost]
        public ActionResult RouteAdd(int id, FormCollection collection)
        {
            FieldTrip trip = context.FieldTrips.Single(ft => ft.ID == id);

            if (trip == null) return Json(new { success = false, message = "Field trip not found." }); ;

            try
            {

                FieldTripRoute tripRoute = new FieldTripRoute();

                tripRoute.FieldTripID = trip.ID;                
                tripRoute.Date = DateTime.Parse(collection["Date"]);
                tripRoute.ArrivalTime = DateTime.Parse(collection["ArrivalTime"] + " " + DateTime.Now.ToShortDateString());
                tripRoute.DepartureTime = DateTime.Parse(collection["DepartureTime"] + " " + DateTime.Now.ToShortDateString());
                tripRoute.Destination = collection["Destination"];
                tripRoute.PickupLocation = collection["PickupLocation"];
                tripRoute.RouteID = Convert.ToInt32(collection["RouteID"]);           

                context.FieldTripRoutes.InsertOnSubmit(tripRoute);
                context.SubmitChanges();

                return Json(new { success = true, message = "Success!" });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, message = ex.Message });
            }
        }

А вот мои столбцы конструктора и таблицы БД:

Designer and DB Table Columns

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

Редактировать: Забыл добавить еще одну вещь, когда я первоначально создавал новый объект FieldTripRoute в начале действия Добавить, я заметил, что он не получает правильный идентификатор из серии идентификаторов базы данных. Возможно, это связано?

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

Я действительно в растерянности из-за того, что может быть причиной этой проблемы. Любые идеи приветствуются.

1 Ответ

1 голос
/ 09 февраля 2012

Это сообщение выдается каждый раз, когда по какой-либо причине строка не вставляется.Для операторов DML Linq to SQL проверяет количество измененных строк.SQL Server возвращает это количество.Проверяется на единицу.

Большой вопрос - почему счетчик равен нулю, а сообщение об ошибке не отправляется SQL Server.Запустите профилировщик SQL Server и опубликуйте SQL, который генерирует L2S.Запустите SQL вручную и посмотрите, что получится.Вставляется ли строка?Возвращается ли его значение идентификатора?

Редактировать: впереди дальнейшая отладка: завершите работу сервера SQL непосредственно перед тем, как перейти к SubmitChanges, чтобы убедиться, что база данных не поражена.Обязательно обрежьте эту ветку за пределами дерева поиска.

Далее перейдите к исходному коду Linq to SQL, чтобы узнать, что происходит.Если у вас есть R #, это легко: нажмите ctrl-shift-t, найдите ChangeProcessor, щелкните и перейдите к «источникам из файлов символов».Найдите функцию SubmitChanges и установите точку останова.Если у вас нет R #, вам нужно найти для этого какое-нибудь учебное пособие в Интернете (это займет около 5 минут).

Просмотрите источник, чтобы выяснить, почему выбрасывается исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...