【问题标题】:Add second table value through foreign key relationship通过外键关系添加第二个表值
【发布时间】:2016-05-23 12:10:50
【问题描述】:

我正在创建一个 elearn 网站,我正在使用数据库优先模型,并且我正在使用存储过程来插入或更新数据。但是我的老师说不要使用存储过程,只使用基本的mvc函数。

现在我有一个问题,我有一个注册表单,其中包含电子邮件或密码或教师或学生角色,角色是一个布尔值,对于教师为 true,对于学生为 false。

当我点击填写表格或点击提交按钮时,它会添加用户信息,但问题是当按下具有基本功能的提交按钮时如何在学生或教师表中添加值。

这是我的存储过程代码:

[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);
    }

这是我的db关系图:

elearn relationship diagram

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-5 ef-database-first


    【解决方案1】:

    这不是 MVC 的做法。你在 Models 中做与数据库相关的事情,而在 Controllers 中只做逻辑。

    看看我的销售点项目中的这段代码。

    此代码来自产品类,它是一个模型类。

        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 方式的方式。您在 Models 中执行 DB 事物并在 Controller 中执行逻辑。

    来自 DAL 的 AddNewProduct() 表单 Products 和 Create() 包含您需要了解的关于在没有存储过程的情况下插入数据库的所有内容

    如果您有兴趣,您也可以拥有look at this。您可以将这个 Model 类继承到您自己的 Models 并获得一些基本功能。

    【讨论】:

    • 您又使用了存储过程先生,我只是说点击提交时如何在学生或教师表中添加值
    • 我没有使用存储过程,我为此创建了一个 SQL 语句。单击按钮检查表单是否已为学生教师提交,然后从模型中运行该查询
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多