ASP.net MVC Проблемы вставки Linq-to-SQL - PullRequest
1 голос
/ 07 июня 2011

Сводка TLDR

У меня возникли некоторые проблемы с функцией InsertOnSubmit () в ASP.net MVC.Как вы строите и вставляете новые объекты в базу данных, не сталкиваясь с ключевыми ограничениями?

Шаги для воспроизведения

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

  1. Создайте новый проект ASP.net MVC 2.
  2. Создайте две таблицы.Эксперименты и результаты с отношением «один ко многим» (показано ниже).
  3. Создайте новое действие в контроллере «Home» под названием «RunExperiment».
  4. Создайте базовые данные linq-to-sqlcontext.
  5. Пусть RunExperiment сгенерирует новый эксперимент и результаты и вставит их в базу данных с помощью нового контекста данных.

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

Example image of database setup.

Теперь взглянем на мой пример функции "RunExperiment":

    public ActionResult RunExperiment(string Title, string Scientist)
    {
        RepositoryDataContext RDC = new RepositoryDataContext();

        // Generate the experiment
        Experiment thisExperiment = new Experiment();
        thisExperiment.experimentTitle = Title;
        thisExperiment.experimentScientist = Scientist;

        // Perform some work.
        System.Threading.Thread.Sleep(500);

        // Attempt to insert the experiment.  
        // Works once, fails subsequently due to duplicate primary key.
        RDC.Experiments.InsertOnSubmit(thisExperiment);
        RDC.SubmitChanges();

        for (int i = 0; i < 5; i++)
        {
            Result thisResult = new Result();
            thisResult.resultDate = DateTime.Now;
            thisResult.resultTemp = i;
            thisResult.Experiment = thisExperiment;

            RDC.Results.InsertOnSubmit(thisResult);
            RDC.SubmitChanges();
        }            

        return View("Index");
    }

Есть мысли?Я знаю, что это основные вещи, но я пытаюсь отойти от простого копирования паттерна Nerd Dinner, но я получаю эти ошибки.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 июня 2011

Можете ли вы подтвердить настройку вашего столбца experimentId в SQL Server - я считаю, это должно быть установлено как:

[experimentId] [int] IDENTITY(1,1) NOT NULL

Мне удалось воспроизвести вашу ошибку, когда я удалил IDENTITY

в LINQ to SQL свойства для столбца должны иметь Int NOT NULL IDENTITY в свойстве «Тип данных сервера»

2 голосов
/ 07 июня 2011

Во-первых, вы захотите обратиться к одной из моих любимых мозгов, а не к вашей связи.

Затем используйте LINQ для автоматического сопоставления внешних ключей. Вызовите SubmitChanges () один раз, чтобы отправить все это.

public ActionResult RunExperiment(string Title, string Scientist)
{
    using (RepositoryDataContext RDC = new RepositoryDataContext())
    {
        // Generate the experiment
        Experiment thisExperiment = new Experiment();
        thisExperiment.experimentTitle = Title;
        thisExperiment.experimentScientist = Scientist;

        // Perform some work.
        System.Threading.Thread.Sleep(500);

        for (int i = 0; i < 5; i++)
        {
            Result thisResult = new Result();
            thisResult.resultDate = DateTime.Now;
            thisResult.resultTemp = i;

            // LINQ will automatically wire up the association during the insert
            thisExperiment.Results.Add(thisResult);
        }

        // Attempt to insert the experiment, with associated results
        RDC.Experiments.InsertOnSubmit(thisExperiment);
        RDC.SubmitChanges();
    }

    return View("Index");
}

Кстати, часть доступа к данным (все, с чем вы боретесь) - это LINQ to SQL, а не специфическая для ASP.NET MVC. Вам не нужно использовать LINQ to SQL с MVC, и вам не нужно использовать MVC с LINQ to SQL.

1 голос
/ 07 июня 2011

Он пытается вставить этот эксперимент снова каждый раз, можете ли вы сделать это другим, добавить результаты в свойство результата эксперимента?

или, альтернативно, просто укажите идентификатор эксперимента вместо ссылки на них?

...