ASP.net MVC Проблемы вставки Linq-to-SQL
Резюме TLDR
У меня есть несколько проблем с функцией InsertOnSubmit () ASP.net MVC. Как вы строите и вставляете новые объекты в базу данных, не сталкиваясь с ключевыми ограничениями?
Действия по воспроизведению
Я пошел вперед и создал простую демонстрацию трех или около того основных проблем, которые у меня были, и, возможно, кто-то может мне помочь здесь.
- Создайте новый проект ASP.net MVC 2.
- Создайте две таблицы - "Эксперименты и результаты" с отношением "один ко многим" (показано ниже).
- Создайте новое действие в контроллере Home под названием "RunExperiment".
- Создайте базовый контекст данных linq-to-sql.
- Пусть 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.
Он пытается вставить этот эксперимент снова каждый раз, можете ли вы сделать это другим, добавить результаты в свойство результата эксперимента?
или, в качестве альтернативы, просто укажите идентификатор эксперимента вместо ссылки на них?