ASP.NET MVC 3 - Linq to SQL объект хранится в сеансе - PullRequest
2 голосов
/ 04 февраля 2011

У меня есть многостраничная (multi-view) форма в MVC, результаты которой будут сохранены в одной таблице базы данных.

Фрагмент кода, который инициализирует объект linq на первой страницеform.

public ActionResult MyForm()
{
    // returns a Linq object stored in session
    Application currentApp = Application.FromSession(); 

    // if null, initialize the object and save to session
    if (currentApp == null)
    {
        currentApp = new Application();
        currentApp.SessionSave();
    }
    return View(currentApp);
}

А вот пример фрагмента кода для последнего действия, которое обновляет некоторые данные из строго типизированной модели, а затем запускает сохранение базы данных.

[HttpPost]
public ActionResult MyForm3(Application app, FormCollection coll)
{
    Application currentApp = Application.FromSession();
    currentApp.Contact = app.Contact;
    currentApp.AddFormToXml(coll);
    currentApp.SessionSave();

    _db.Applications.InsertOnSubmit(currentApp);
    _db.SubmitChanges();

    return RedirectToAction("Blah");
}

Проблема Я сталкиваюсь с тем, что SubmitChanges завершается с ошибкой

Невозможно вставить значение NULL в столбец ApplicationData, таблица «MyTable»;столбец не допускает пустых значений.Вставить не удается.Оператор был прерван.

В этом случае ApplicationData является столбцом типа xml, который LINQ интерпретирует как объект XElement.Когда я устанавливаю точку останова на SubmitChanges () и проверяю значение app.ApplicationData, оно четко заполняется (не ноль), и все же я продолжаю получать эту ошибку.Я думал только о том, что я неправильно понимаю, как работают контексты данных.Это только кажется, что есть проблема с этим одним столбцом, хотя.Возможно ли, что мне нужно найти способ присоединить объект XElement (ApplicationData) к моему активному контексту данных (_db), и если да, как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 04 февраля 2011

Посмотрите на фактический SQL, сгенерированный и отправленный на сервер.

Запустите SQL Server Profiler (в меню инструментов в SQL Server Management Studio) и запустите трассировку.Запустите ваше приложение, пока оно не выйдет из строя.Вернитесь к профилировщику SQL и посмотрите на запросы SQL.Просмотр вещей с конца SQL иногда позволяет легко определить ошибку, например, выяснить, выполняете ли вы несколько вставок вместо одной.

0 голосов
/ 04 февраля 2011

Хорошо, поэтому в упомянутом вами методе действия вы можете проверить, вызываете ли вы метод InsertOnSumbit снова где-либо еще, прежде чем наконец вызовете db.SubmitChanges () ... или если вы вызываете метод InsertOnSubmit несколько раз. .. Я думаю, что это вызовет проблему, если вы вызываете его дважды для одного и того же объекта.

Обновление: Я попробовал образец с одной таблицей и смог вставить данные XML, как указано ниже.

    DataClassesDataContext ctx = new DataClassesDataContext();
    Application a1 = new Application();
    XName n = "dfdsf";
    a1.ApplicationData = new XElement(n);
    ctx.Applications.InsertOnSubmit(a1);
    ctx.SubmitChanges();

итак, теперь вопрос будет в том, как выглядят данные вашего столбца ??? если вы можете опубликовать пример содержимого данных приложения, это будет полезно. Также, как вы устанавливаете значение свойства ApplicationData?

0 голосов
/ 04 февраля 2011

Хорошо, я предлагаю вам сравнить тип данных столбца «ApplicationData» в вашей модели контекста и в таблице базы данных.

Также, пожалуйста, проверьте сопоставления LINQ to SQL для этого столбца «AppliationData»на самом типе данных.

Пожалуйста, обновите ваш пост, если вы найдете что-нибудь ...

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