【问题标题】:MVC - Insert post data into databaseMVC - 将帖子数据插入数据库
【发布时间】:2013-08-28 16:43:00
【问题描述】:

我正在使用 MVC 并创建了一个表单来将值插入到我的数据库中。

我的数据库结构有关系:

  • 一个 -> 许多
  • 很多 -> 很多

例如: User 表包含表 Company 的外键。在我看来,我有一个包含所有公司的下拉列表。

我可能需要一个使用外键将数据插入表的工作示例。 我已经四处搜索并尝试了许多解决方案,但无法弄清楚如何使其发挥作用。

这是我的代码:

型号:

 public class DefaultConnection : DbContext
    {
        public DefaultConnection()
            : base("DefaultConnection")
        {
        }

        public DbSet<User> users{ get; set; }
    }

    public class Company
    {
        public int Id { get; set; }
        public string Name{ get; set; }
    }
public class User
    {
        public int Id { get; set; }

        [ForeignKey("Company")]
        public int Id_Company { get; set; }
        public Company Company{ get; set; }
    }

视图模型:

public class MyViewModel
    {
        public MyViewModel()
        {
            this.u= new User();
            this.cl = new Companylist();  <== another class which i have create a selectlist
        }

        public User u{ get; set; }
        public Companylist cl{get;set;}
}

查看:

<ol>
   <li>
      @Html.LabelFor(m => m.cl.Ncompany)<br />
      @Html.DropDownListFor(o => o.cl.Ncompany, Model.cl.Ncompany, "-- Select --", new { @class = "abc" })
    </li>
    <li>
      @Html.LabelFor(m => m.u.Name)<br />
      <input type="text" name="Name" value="" />
    </li>
</ol>

控制器:

 [HttpPost]
        public ActionResult Create(MyViewModel model)
        {
            if (ModelState.IsValid)
            {
                db.users.Add(model);?????????????????
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(model);
        }

【问题讨论】:

  • 您也可以尝试使用选项"MVC Controller with read/write ... using Entity Framework" 创建一个新的 MVC 控制器。然后检查 Visual Studio 为控制器和视图生成的代码。
  • 您不需要 VIewModel 中的公司列表。更改视图模型以保存用户数据和公司 ID,就像用户实体一样。
  • 可能是你的数据库有问题?确保应用程序不是每次都重新创建数据库。

标签: c# mysql sql asp.net-mvc entity-framework


【解决方案1】:

首先,您的 DropDownListFor 似乎设置不正确,因为下拉列表是针对 User.Id_Company 而不是针对公司列表的。很可能应该是:

<li>
      @Html.LabelFor(m => m.cl.Ncompany)<br />
      @Html.DropDownListFor(o => o.u.Id_Company, Model.cl.Ncompany, "-- Select --", new { @class = "abc" })
    </li>

接下来,在您的控制器中,您可以直接从返回的模型中插入,但在某些时候,您可能会退出使用域模型(数据库表的模型)并开始使用视图模型。话虽如此,您可以像这样添加一个新用户:

[HttpPost]
public ActionResult Create(MyViewModel model)
{
    if (ModelState.IsValid)
    {
        var db = new DefaultConnection(); (?? is this what your context is called?)
        db.users.Add(new User{
           Id_Company = model.u.Id_Company, 
           Name = model.u.Name
        });
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(model);
}

【讨论】:

  • 感谢 tommy 的帖子,但现在我收到此错误 ==> 没有为此对象定义无参数构造函数。
  • 你在哪里声明你的 db 变量?您提到的这个错误是在哪里发生的?
  • 我在上面的控制器中声明了我的 db 变量... private DefaultConnection db = new DefaultConnection();
  • 你应该在你的控制器中放置一个断点并找出导致崩溃的那一行...
  • 嗯好吧,汤米我去看看
【解决方案2】:

您的ViewModel 有一个CompanyUser。插入时需要将实体与数据库表实体进行匹配。

尝试这样做:

[HttpPost]
        public ActionResult Create(MyViewModel model)
        {
            if (ModelState.IsValid)
            {
                db.users.Add(model.User);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(model);
        }

用外键插入表应该和其他插入一样。假设您有公司的数据库行,它应该可以正常运行。

User user = new User
{
    Id_Company = 1
}

db.users.Add(user);
db.SaveChanges();

【讨论】:

  • 我尝试过但没有成功:(
  • @user2232273 您是否使用@Html.Beginform() 将新数据收集到控制器?
  • 调试并确保值正确地发送到您的控制器。
  • 我在行出现错误 -> db.SaveChanges();错误:INSERT 语句与 FOREIGN KEY 约束“FK_User_Company”冲突。冲突发生在数据库“Mydatabase”、表“dbo.Company”、列“Id”中。
  • @user2232273 您确定您引用的 ID 中有数据吗?例如,如果您创建了一个接收用户 2 外键的新公司行,则您需要拥有 ID 2 的用户。
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 2018-11-21
相关资源
最近更新 更多