实体字段未保存

时间:2014-08-04 04:53:26

标签: asp.net-mvc entity-framework

我正在使用面向.NET 4.5的Visual Studio 2013,MVC 5.1,EF 6.0。代码优先,使用默认连接字符串。

我有一个非常简单的实体,名为SchoolModel,如下所示。

public class SchoolModel
{
    [HiddenInput(DisplayValue = false)]
    [Key]
    public int Id { get; private set; }

    [Display(Name="School Name")]
    [DataType(DataType.Text)]
    public string Name { get; private set; }
}

我使用脚手架功能创建标准的MVC5视图/控制器组合,分别命名为School和SchoolController。我正在尝试将一些学校记录添加到数据库中。

创建视图:

@model OddsOnEnglish.GamingIELTS.Web.Models.SchoolModel

[snip]

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>SchoolModel</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Name, new {@class="col-md-2"})
            <div class="col-md-offset-2 col-md-10">
                @Html.EditorFor(model => model.Name)
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

SchoolController.Create:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,Name")] SchoolModel schoolModel)
{
    if (ModelState.IsValid)
    {
        db.Schools.Add(schoolModel);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(schoolModel);
}
上面的

dbSchoolContext的实例:

public class SchoolContext : DbContext
{
    public SchoolContext() : base("name=DefaultConnection")
    {
    }

    public DbSet<Models.SchoolModel> Schools { get; set; }
}

一切都很简单,基于各种教程。我的问题是,当我提交创建学校表单时,索引页面会再次显示新学校的新行,但不显示任何名称。查看数据库时,行会被添加到相应的表中,但Id列中只有一个值 - 没有名称。如果我在数据库中手动输入名称,那么它将显示在Web界面中。显然正在创建记录,但没有填充名称字段。

1 个答案:

答案 0 :(得分:0)

只需将您的模型更正为:

public class SchoolModel
{
[HiddenInput(DisplayValue = false)]
[Key]
public int Id { get; set; }

[Display(Name="School Name")]
[DataType(DataType.Text)]
public string Name { get; set; }
}

您遇到的这个问题是因为私有设置块只是纠正它。