WedX - журнал о программировании и компьютерных науках

"Инструкция INSERT конфликтует с ограничением FOREIGN KEY.

Сообщение об ошибке:

Оператор INSERT конфликтовал с ограничением FOREIGN KEY «FK_UserProfile_UserLogin». Конфликт произошел в базе данных "ToDoDB", таблице "dbo.UserLogin", столбце "UserLoginID". Заявление было прекращено.

Что это может означать?

Я пытаюсь создать простое веб-приложение для входа и профиля MVC5. Я создал свою таблицу в SQL Express.

Во-первых, вот моя модель страницы регистрации:

public class UserSignUp
{
    [Key]
    public int UserLoginID { get; set; }

    //Foregin key for the login table - First name, last name, creation date, and email
    public int UserProfileID { get; set; }

    [Required(ErrorMessage = "Username is required")]
    [Display(Name = "Username")]
    public string Username { get; set; }

    [Required(ErrorMessage = "Password is required")]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Required(ErrorMessage = "First Name is required")]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name is required")]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime CreationDate { get; set; }

    [Required(ErrorMessage = "Valid email is required")]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }
}

Таким образом, UserLoginID — это первичный ключ из таблицы UserLogin, а UserProfileID — это первичный ключ из таблицы UserProfile. Я установил внешний ключ таблицы UserProfile на UserLoginID из таблицы UserLogin.

Вот моя модель создания нового пользователя:

public class UserProfileManager
{
    public void AddUserAccount(UserSignUp newUser)
    {
        // create database connection
        using (ToDoDBEntities db = new ToDoDBEntities())
        {
            // Collect viewmodel data
            // Here building goes by object type and not foregin key relationship
            UserLogin UL = new UserLogin();
            UL.Username = newUser.Username;
            UL.Password = newUser.Password;

            // Add the UserLogin object I just built to the database
            db.UserLogins.Add(UL);
            db.SaveChanges();

            UserProfile UP = new UserProfile();
            // establish connection to UL by establishing foreign key relationship
            UP.UserLoginID = newUser.UserLoginID;
            UP.FirstName = newUser.FirstName;
            UP.LastName = newUser.LastName;
            UP.CreationDate = newUser.CreationDate;
            UP.Email = newUser.Email;

            // Add UserProfile object to databse and save changes
            db.UserProfiles.Add(UP);
            db.SaveChanges();
        }
    }

    //Check if user is real before login is allowed
    public bool isLoginReal(string LoginName)
    {
        using (ToDoDBEntities DB = new ToDoDBEntities())
        {
            // Return the user from the DB whose login name matches the LoginName string passed in as perameter
            return DB.UserLogins.Where(o => o.Username.Equals(LoginName)).Any();
        }
    }
}

Мой AddUserAccount — это место, где, как мне кажется, у меня проблемы. Итак, я начинаю с создания объекта UserLogin, добавления и сохранения в базе данных. Кажется, это действительно работает. Но следующий шаг, когда я создаю, добавляю и сохраняю объект UserProfile, похоже, не работает. По крайней мере, база данных не обновляется.

Вот контроллер, обрабатывающий действия:

public class AccountController : Controller
{
    // GET: Account
    public ActionResult Index()
    {
        return View();
    }

    #region signup methods
    // Get method for signup page
    public ActionResult SignUpPage()
    {
        return View();
    }

    // Post method for signup page - post to db
    [HttpPost]
    // Pass in the UserSign up model object to be built
    public ActionResult SignUpPage(UserSignUp USUV)
    {
        // Form is filled out and then method is entered
        if (ModelState.IsValid)
        {
            // Form is filled out and database connection is established if form is valid
            UserProfileManager UPM = new UserProfileManager();

            if (!UPM.isLoginReal(USUV.Username))
            {
                // data access . adduseraccount from entity manager (where model objects are built)
                UPM.AddUserAccount(USUV);
                FormsAuthentication.SetAuthCookie(USUV.FirstName, false);
                return RedirectToAction("Welcome", "Home");
            }
            else
            {

            }
        }
        return View();
    }
    #endregion
}

На мой (нубский) взгляд все выглядит хорошо. Получен SignUpPage, затем новый объект UserSignUp передается в действие Post, строится объект Entity Framework (UserProfileManager), форма аутентифицируется, и пользователь либо перенаправляется в представление Welcome, либо пользователь возвращается в представление регистрации .

Есть ли шанс, что кто-то может помочь мне понять, что я упускаю или делаю неправильно? Я включил изображение дизайна базы данных для справки (я знаю о базе данных еще меньше, чем MVC).

Дизайн базы данных


  • Пробовали ли вы поставить точку останова в первой строке AddUserAccount(), чтобы убедиться, что у newUser есть значения? 07.05.2016
  • Хорошо, теперь это дает мне ошибку: оператор INSERT конфликтует с ограничением FOREIGN KEY FK_UserProfile_UserLogin. Конфликт произошел в базе данных ToDoDB, таблица dbo.UserLogin, столбец «UserLoginID». Выписка прекращена Что бы это могло значить? 07.05.2016
  • Поставьте точку останова перед вторым db.SaveChanges() и проверьте правильность значения UP.UserLoginID. 07.05.2016
  • Имя пользователя, пароль, имя, фамилия, дата создания и адрес электронной почты имеют правильные значения. UserLogin отображается как 0. Но должно быть 1, верно? Если это первый элемент, который будет введен в БД? У меня есть обе эти таблицы с увеличивающимися (1.1) первичными ключами. И в таблице профилей пользователей UserLoginID установлен как внешний ключ. Что может быть не так? 07.05.2016
  • Удался ли первый db.SaveChanges()? Есть ли записи в вашей таблице UserLogin после первого db.SaveChanges()? 07.05.2016
  • Да, это так. Я попытался заставить это работать, и оба раза SaveChanges() для таблицы UserLogin сработало. Только не UserProfile 07.05.2016
  • Проверьте мой ответ, пожалуйста :) 07.05.2016

Ответы:


1

Ах да, после того, как проблема здесь:

UP.UserLoginID = newUser.UserLoginID;

Это не newUser, это должно быть:

UP.UserLoginID = UL.UserLoginID;

Поскольку вы только что добавили объект UL в базу данных, чтобы получить сгенерированный идентификатор вставленного объекта, вы должны вызвать его, а не объект newUser.

07.05.2016
  • ты удивительный. Это было все-таки. Большое спасибо. БД полностью обновилась, но теперь я получаю сообщение об ошибке HTTP 401.0 — не авторизовано. Он не будет перенаправлять на представление приветствия. Это из-за аннотации [авторизовать] для экрана приветствия? 07.05.2016
  • Да, дважды проверьте процесс аутентификации :) 07.05.2016
  • Хотел бы я дать вам миллион голосов. Теперь мне просто нужно выяснить, как добавить еще одну таблицу в мою базу данных и все коррелирующие с ней элементы управления. 07.05.2016
  • Спасибо. Рад помочь :D 07.05.2016
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]