MVC / EF DB First和SQL约束默认时间戳字段



我的模型有一个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>

当试图在创建视图中创建一个新记录时,我要么得到该字段是必需的,要么将空写入时间戳字段。我认为我的问题是我不确定如何处理控制器或视图中自动生成的字段。任何人都可以帮助如何写这样一个字段的记录,或者如果我需要添加任何特定的数据注释?

我猜您是从视图中获取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)

当你使用Include时,你说,从我从FORM获得的对象中只取ChainId,Name其余的属性将是NULL

这就是为什么你得到一个错误,试图插入NULL

 db.Chains.Add(chain);
 db.SaveChanges();

查看视频教程,也许你能更好地理解它。

如果您构建自己的SqlQuery对象,那么您可以指定您的参数并省略Timestamp字段。在这种情况下,DEFAULT将应用

最新更新