【问题标题】:MVC / EF DB First and SQL Constraint Default TimeStamp fieldMVC / EF DB First 和 SQL 约束默认时间戳字段
【发布时间】:2016-12-26 17:04:05
【问题描述】:

我的模型有一个 TimeStamp 列,该列在创建记录时自动生成。我正在使用带有 Razor 语法的默认 CRUD 脚手架。此时我才刚刚开始使用该项目,因此它是使用实体框架从 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 写入 TimeStamp 字段。我认为我的问题是我不确定如何处理控制器或视图中的自动生成字段。任何人都可以帮助如何编写包含此类字段的记录,或者我是否需要添加任何特定的数据注释?

【问题讨论】:

  • 告诉我们你现在在做什么?请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • 检查你的变量chainTimeStamp 有什么值?

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


【解决方案1】:

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

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

  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();

检查一下这个video tutorial,也许你会更好地理解它。

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

【讨论】:

  • 谢谢,设置 model.TimeStamp = DateTime.Now 成功了。考虑到自动生成的字段仍然存在,我不确定它是否适合我,但它达到了相同的目的。
  • 感谢您的信息!这只是我的第二个 MVC 项目,我喜欢 kudvenkat 的视频!我觉得我的问题是它在我的数据库中是一个必需的 NOT NULL 字段,所以当我尝试将它包含在绑定中但也将它隐藏在表单上时它会吓坏。我说的对吗?
  • 不确定发生了什么。但是您可以尝试查看发送到 DB 的 Sql Query 是什么。将不得不对其进行测试,但我相信 EF 会尝试插入每个字段,因此不会实现默认值。这就是为什么我提到您可以创建自己的 SqlQuery。
  • 是的,看起来是一个反复出现的问题。 stackoverflow.com/questions/1609304/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多