Добавление второго табличного значения через отношение внешнего ключа

Я создаю веб-сайт elearn, я использую первую модель базы данных, и я использую хранимую процедуру для вставки или обновления данных. Но мой учитель сказал Не использовать хранимую процедуру, только использовал основную функцию mvc.

Теперь у меня есть проблема, у меня есть регистрационная форма, которая принимает электронную почту или пароль, а также роль учителя или ученика, роль-это логическое значение, которое истинно для учителя или ложно для ученика.

Когда я нажимаю заполнить форму или нажал на кнопку Отправить, он добавляет userinfo, но вопрос в том, как добавить добавленное значение в таблице ученика или учителя при нажатии на кнопку Отправить с основной функцией.

Это мой код со хранимой процедурой:

[HttpPost]
public ActionResult Register(tbl_UserInfo user)
{
    try
    {
        if (ModelState.IsValid)
        {
            using (var db = new ELearnDataBase())
            {
                try
                {
                    if (cmd.Parameters != null)
                        cmd.Parameters.Clear();

                    if (cs.State != ConnectionState.Open)
                        cs.Open();

                    cmd = new SqlCommand("dbo.insertintoInfo", cs); //Table1
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@email", user.Email);
                    cmd.Parameters.AddWithValue("@pwd", user.Pwd);
                    cmd.Parameters.AddWithValue("@role", user.Role);

                    if (cmd.ExecuteNonQuery() > 0)
                    {
                        //db.SaveChanges();

                        if (user.Role)    // teacher
                        {
                            var modell = db.tbl_UserInfo
                                          .Where(r => r.Email.Equals(user.Email) && r.Pwd.Equals(user.Pwd))
                                          .First();

                            cmd = new SqlCommand("dbo.AddAddress", cs); //Table1
                            cmd.CommandType = System.Data.CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@id", modell.Id);
                            cmd.Parameters.AddWithValue("@street", "");
                            cmd.Parameters.AddWithValue("@city", "");
                            cmd.Parameters.AddWithValue("@state", "");
                            cmd.Parameters.AddWithValue("@postalCode", 0);

                            cmd.ExecuteNonQuery();

                            cmd = new SqlCommand("dbo.AddCourse", cs); //Table1
                            cmd.CommandType = System.Data.CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@cid", modell.Id);
                            cmd.Parameters.AddWithValue("@name", "");
                            cmd.Parameters.AddWithValue("@desc", "");
                            cmd.Parameters.AddWithValue("@duration", "");
                            cmd.Parameters.AddWithValue("@fee", 0.00);
                            cmd.Parameters.AddWithValue("@c_class", "");

                            cmd.ExecuteNonQuery();

                            cmd = new SqlCommand("dbo.insertintoTeacherInfo", cs); //Table1
                            cmd.CommandType = System.Data.CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@id", modell.Id);
                            cmd.Parameters.AddWithValue("@dept", "");
                            cmd.Parameters.AddWithValue("@rank", "");

                            cmd.ExecuteNonQuery();

                            cs.Close();
                        }
                        else   //student 
                        {
                            var modell = db.tbl_UserInfo
                                           .Where(r => r.Email.Equals(user.Email) && r.Pwd.Equals(user.Pwd))
                                           .First();

                            cmd = new SqlCommand("dbo.AddAddress", cs); //Table1
                            cmd.CommandType = System.Data.CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@id", modell.Id);
                            cmd.Parameters.AddWithValue("@street", "");
                            cmd.Parameters.AddWithValue("@city", "");
                            cmd.Parameters.AddWithValue("@state", "");
                            cmd.Parameters.AddWithValue("@postalCode", 0);

                            cmd.ExecuteNonQuery();

                             cmd = new SqlCommand("dbo.insertintoStudentInfo", cs); //Table1
                             cmd.CommandType = System.Data.CommandType.StoredProcedure;
                             cmd.Parameters.AddWithValue("@id", modell.Id);
                             cmd.Parameters.AddWithValue("@roll", @DateTime.Now.Year + " ElearnWeb"+""+modell.Id);

                             cmd.ExecuteNonQuery();

                             cs.Close();
                         }

                         return RedirectToAction("Index", "Home");
                     }      //return "Done";
                     else 
                     {
                          return RedirectToAction("Index", "Home");
                     }

                     // return "Failed";
                 }
                 catch (DbEntityValidationException e)
                 {
                     Console.WriteLine("Invalid Statement", e);
                 }

                 cs.Close();

                 // return RedirectToAction("Index", "Home");
             }
         }
         else
         {
             ModelState.AddModelError("", "Data is not correct");
         }
     }
     catch (DbEntityValidationException e)
     {
         foreach (var eve in e.EntityValidationErrors)
         {
             Console.WriteLine("Entity of type "{0}" in state "{1}" has the following validation errors:",
             eve.Entry.Entity.GetType().Name, eve.Entry.State);

             foreach (var ve in eve.ValidationErrors)
             {
                 Console.WriteLine("- Property: "{0}", Error: "{1}"",
                        ve.PropertyName, ve.ErrorMessage);
             }
          }

          throw;
      }

      return View();
}

Без использования хранимой процедуры:

   [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(tbl_UserInfo user)
    {
        if (ModelState.IsValid)
        {

            using (ElearnDataBase db = new ElearnDataBase())
            {

                db.tbl_UserInfo.Add(user);

                db.SaveChanges();
            }

                if (user.Role)//teacher
                {


                    var modell =
                                       db.tbl_UserInfo
                                        .Where(r => r.Email.Equals(user.Email) && r.Pwd.Equals(user.Pwd))
                                        .First();


                }
                else//student 
                {

                    var modell =
                                       db.tbl_UserInfo
                                        .Where(r => r.Email.Equals(user.Email) && r.Pwd.Equals(user.Pwd))
                                        .First();






                }





        }


        return View(user);
    }

Это моя диаграмма отношений БД:

диаграмма отношений elearn

1 ответ

  1. Это не MVC способ сделать это. Вы делаете связанные с базой данных вещи в моделях и только логики в контроллерах.

    Взгляните на этот код из моего проекта Point of Sale.

    Этот код из класса Products, который является классом модели.

        public bool SaveNewProduct(string name, int unitid, int catid, int compid, float salerate, float purchaserate, int openingamout)
        {
            string query = "INSERT INTO Products (pname,punitid,pcategoryid,pcompanyid,psalerate,purchaserate,openingamount) VALUES('" + name + "'," + unitid + "," + catid + "," + compid + "," + salerate + ","+purchaserate+"," + openingamout + ")";
            int temp = dal.Create(query);
            if (temp == 1)
            {
                return true;
            }
    
            return false;
        }
    

    Класс DAL:

        public int Create(string query)
        {
            SqlCommand cmd = new SqlCommand(query, conn);
            conn.Open();
            int returnVal = cmd.ExecuteNonQuery();
            conn.Close();
            return returnVal;
        }
    

    Часть контроллера:

    [HttpPost]
    public ActionResult AddNewProduct(string name, string unit, string category, string company, String salerate, string purchaserate, string openingamount)
    {
        // You perform the validations first which I am not including.
        // If all validations are good, then you call the add method from the Products model
    
        Products p = new Products();
        bool check = p..SaveNewProduct(name, unitid, catid, compid, srate, prate, oamount);
    
        if (check)
        {
        ViewBag.MessageType = "Success";
        ViewBag.Message = "New Product added";
        }
    }
    

    Это то, как вы делаете путь MVC. Вы выполняете вещи DB в моделях и делаете логику в контроллере.

    Форма AddNewProduct() Products and Create () from DAL содержит все необходимые сведения о вставке в базу данных без хранимых процедур

    Вы также можете посмотреть на это, если вам интересно. Вы можете наследовать этот класс модели своим собственным моделям и получить некоторые базовые функции.