Невозможно сохранить изменения в дочерних таблицах, используя LINQ to SQL с ограничениями внешнего ключа - PullRequest
0 голосов
/ 17 июля 2010

Я пытаюсь научить себя LINQ to SQL и решил сделать небольшой проект MVC.NET, чтобы мои ноги промокли. Проблема в том, что я очень рано упал со следующей ошибкой.

Я делаю приложение для гольфа, поэтому я настроил базу данных и сделал свои уроки по dbml. База данных имеет таблицу course и таблицу hole. Таблица hole ссылается на courseId по его первичному ключу и имеет ограничение для внешнего ключа. Так что все довольно стандартно.

У меня есть действие MVC на моем контроллере, которое позволяет мне редактировать информацию о курсе (имя, информация о дыре, например, индекс пар и ход и т. Д.)

Когда я сохраняю файл после редактирования, я получаю следующую ошибку.

" Была предпринята попытка удалить связь между курсом и лункой. Однако один из внешних ключей отношения (Hole.CourseId) не может быть установлен равным нулю . «

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

Вот код действия:

    [HttpPost]
    [ValidateInput(true)]
    public ActionResult Edit(int id, FormCollection collection)
    {
        var courseViewModel = new CourseViewModel { Course = _repository.GetCourse(id) };

        if (courseViewModel.Course == null)
        {
            return View("NotFound", string.Format("Course {0} Not Found", id));
        }

        try
        {
            UpdateModel(courseViewModel);
            _repository.SubmitChanges();

            return RedirectToAction("Index", "Course");
        }
        catch (Exception ex)
        {
            ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
            ModelState.AddModelError("", ex.Message);

            return View(courseViewModel);
        }
    }

Где _repository выглядит так:

    namespace Web.Repository
    {
        public class MyRepository
        {
            private MyDataContext db = new MyDataContext();

            public void SubmitChanges()
            {
                db.SubmitChanges();
            }

            public Course GetCourse(int id)
            {
                return db.Courses.SingleOrDefault(i => i.CourseId == id);
            }
        }
    }

1 Ответ

0 голосов
/ 19 июля 2010

Что делает UpdateModel? Предполагая, что он вносит изменения в участника курса в вашей модели представления, вы можете рассмотреть метод хранилища, подобный этому:

public void SaveCourse(Course course)
{
  db.Courses.Attach(course);
  db.SubmitChanges();
}
...