ASP.net MVC Проблемы вставки Linq-to-SQL

Резюме TLDR

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

Действия по воспроизведению

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

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

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

Пример изображения настройки базы данных

Теперь взгляните на мой пример функции "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 ответа

Решение

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

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

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

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

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

Затем используйте 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.

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

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

Другие вопросы по тегам