【问题标题】:Why can not I increment the primary key automatically?为什么我不能自动增加主键?
【发布时间】:2014-08-13 05:57:40
【问题描述】:

我首先使用实体​​框架代码创建了一个数据库。但是当 Create 视图中的表单发布到 (post)Create 动作时,每个项目对象的 id 始终为 0。因此 Model.State 始终为 false。所以我无法将项目类的对象保存到数据库中。我尝试使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 增加 id。但它仍然需要零。

我在创建操作(帖子)中的错误消息是“需要 projectID 字段。”

我的项目类:

    public class Project
    {
      [Column(Order = 100)]
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public int projectID { get; set; }


      public string projectName { get; set; }


      public string descriptionProject { get; set; }

      public Project parentProject { get; set; }
    }

我的项目控制器:

    // GET: Projects/Create
    public ActionResult Create()
    {
        var projectList = db.Projects.ToList().Select(
            c => new SelectListItem
            {
                Selected = false,
                Text = c.projectName,
                Value = c.projectID.ToString()
            }
            ).ToList();
        ViewData["ProjectList"] = projectList;
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "projectID,projectName,descriptionProject,identifier,date")] Project project)
    {

        var projectList = db.Projects.ToList().Select(
            c => new SelectListItem
            {
                Selected = false,
                Text = c.projectName,
                Value = c.projectID.ToString()
            }
            ).ToList();
        ViewData["ProjectList"] = projectList;

        if (ModelState.IsValid)
        {
            db.Projects.Add(project);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(project);
    }

我的创建视图:

    @model BulguTakipSistemiv2.Models.Project

    <h2>Create</h2>

    @using (Html.BeginForm())
    {
         @Html.AntiForgeryToken()
         @Html.ValidationSummary(true)
         <form class="form-horizontal">
            <fieldset>
               <legend>Project</legend>

                 <div class="form-group">
                    @Html.LabelFor(model => model.projectName, new { @class = "col-lg-2 control-label" })

                     <div class="col-lg-10">
                         <p>@Html.EditorFor(model => model.projectName, new { @class = "form-control" })</p>
                         @Html.ValidationMessageFor(model => model.projectName)
                     </div>
                 </div>

                 <div class="form-group">
                     @Html.LabelFor(model => model.descriptionProject, new { @class = "col-lg-2 control-label" })

                     <div class="col-lg-10">
                         <p>@Html.EditorFor(model => model.descriptionProject, new { @class = "form-control" })</p>
                         @Html.ValidationMessageFor(model => model.descriptionProject)
                     </div>
                 </div>

                 <div class="form-group">
                     @Html.LabelFor(model => model.parentProject, new { @class = "col-lg-2 control-label" })

                     <div class="col-lg-10">
                         <p>@Html.DropDownListFor(model => model.projectID, (IEnumerable<SelectListItem>)ViewData["ProjectList"], " --Select Parent Project--")</p>
                         @Html.ValidationMessageFor(model => model.parentProject)
                     </div>
                </div>



                <div class="form-group">
                    <p class="col-lg-12">
                       <input type="submit" value="Create" class="btn btn-primary btn-lg" />
                   </p>
                </div>
         </fieldset>
    </form>
  }

提前致谢。另外我的连接字符串如下:

  <connectionStrings>
      <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-BulguTakipSistemiv2-20140812112012yeni6;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-BulguTakipSistemiv2-20140812112012.mdf" providerName="System.Data.SqlClient" />
      <add name="DBContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=BulguTakipSistemiv2yeni6;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

【问题讨论】:

  • 您使用哪些 dbms?
  • 我所知道的唯一支持 AI 的 dbms 是 MySQL。可以通过使用触发器来连接其他 dbms。您使用的是什么 DBMS?
  • 我正在使用 SQL Server 2012 Express LocalDB。
  • 你能检查一下数据库端的“projectID”字段是否真的设置了“Identity”属性吗?

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


【解决方案1】:

因为您将主键值的位置设置为数据库责任,所以在创建实体并将其添加为数据行之后,我的意思是在数据库中的 (db.SaveChanges();) 之后获取它的值并请删除任何属性从你的商务舱

【讨论】:

  • 创建模型后,我在我的项目类中添加了一个嵌套类,然后我删除了这个嵌套类,但我想删除这个嵌套类是不够的。因为当我查看我的数据库表时,有 2 个 id。也许是因为这个原因,我得到了这个错误。我删除了所有模型,然后再次创建。现在它起作用了。感谢您的快速回复。
【解决方案2】:

改变这个

@Html.DropDownListFor(model => model.projectID,

进入

@Html.DropDownListFor(model => model.parentProject.projectID,

【讨论】:

  • 我之前应用过这个解决方案 :) 但 parentProject.projectID 返回零可能是因为我的 GetProjectSelectionList() 方法(顺便说一下,我将选择项目列表添加到我的视图模型而不是 viewBag 或视图data )它仅适用于 model.projectID 不适用于 model.parentProject.projectID 我不知道为什么。我可以在项目 ID 中获取父 ID,然后在我的项目类中创建 parentProjectId 属性并将项目 ID 分配给该属性。最后,我搜索了一个具有此 ID 的 parentProject,并将其作为父项目添加到项目中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2016-11-19
  • 2021-07-04
  • 2018-06-05
  • 1970-01-01
相关资源
最近更新 更多