MVC / EF DB First和SQL Constraint默认TimeStamp字段

时间:2016-08-19 13:47:18

标签: sql vb.net entity-framework model-view-controller

我的模型有一个TimeStamp列,它是在创建记录时自动生成的。我使用默认的CRUD脚手架和Razor语法。在这一点上,我刚刚开始使用该项目,因此它是使用实体框架从Visual Studio中生成的基本控制器和视图。

在数据库中将列设置为:

TimeStamp DATETIME NOT NULL CONSTRAINT [DF_Chains_TS] DEFAULT (GETDATE())

这是生成的模型:

public partial class Chain
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]

    public int ChainId { get; set; }
    public string Name { get; set; }
    public System.DateTime TimeStamp { get; set; }
}

这是控制器:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ChainId,Name")] Chain chain)
    {
        if (ModelState.IsValid)
        {
            db.Chains.Add(chain);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(chain);
    }

我在视图中尝试这个:

<div class="form-group">
        @*Html.LabelFor(model => model.TimeStamp, htmlAttributes: new { @class = "control-label col-md-2" })*@
        <div class="col-md-10">
            @Html.HiddenFor(model => model.TimeStamp, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.TimeStamp, "", new { @class = "text-danger" })
        </div>
    </div>

尝试在“创建视图”中创建新记录时,要么获取该字段,要么将该字段写入TimeStamp字段。我认为我的问题是我不确定如何处理控制器或视图中的自动生成字段。任何人都可以帮助如何使用这样的字段编写记录,或者我是否需要添加任何特定的数据注释?

1 个答案:

答案 0 :(得分:1)

我的猜测是您从视图中获取NULL并插入NULL,但您的字段说NOT NULL

而不是仅仅从EF Insert查询中省略参数。所以默认接管。

  INSERT INTO yourTable (field1, yourDate) VALUES ('something', NULL);
  vs
  INSERT INTO yourTable (field1) VALUES ('something');  

您可以随时在EF侧设置字段;

  Model.TimeStamp = DateTime.Now;

修改

([Bind(Include = "ChainId,Name")] Chain chain)

当您使用{1}}时,我从Include仅获取FORM的对象,其余属性将为ChainId,Name

这就是您尝试插入NULL

时出错的原因
NULL

选中 video tutorial ,也许您可​​以更好地理解它。

如果您构建自己的 db.Chains.Add(chain); db.SaveChanges(); 对象,则可以指定参数并省略Timestamp字段。在这种情况下,SqlQuery将适用