2016-08-19 75 views
0

我的模型有一個TimeStamp列,當創建記錄時會自動生成該列。我在Razor Syntax中使用默認的CRUD腳手架。在這一點上,我剛剛開始使用該項目,因此它是使用實體框架從Visual Studio生成的基本控制器和視圖。MVC/EF DB First和SQL約束默認時間戳字段

列設置爲這個數據庫:

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> 

當試圖在創建視圖中創建新記錄時,我要麼獲取該字段是必需的,要麼將它寫入時間戳記字段爲空。我想我的問題是我不知道如何處理控制器或視圖中的自動生成的字段。任何人都可以幫助如何寫這樣的領域的記錄,或者如果我需要添加任何特定的數據註釋?

+1

告訴我們你現在在做什麼?請閱讀[** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t這裏是[** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/),瞭解如何提高您的問題質量並獲得更好的答案。 –

+0

更新了我的帖子。 – justiceorjustus

+0

檢查你的變量'chain'在TimeStamp上有什麼值? –

回答

1

我的猜測是,您將可以從視圖中獲得NULL和插入NULL,但你的領域說NOT NULL

而不是僅僅ommit從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對象,則可以指定參數並省略時間戳記字段。在這種情況下,DEFAULT將適用

+0

謝謝,設置model.TimeStamp = DateTime.Now做了訣竅。考慮到自動生成的字段仍然存在,我不確定它是否適合我,但它達到了相同的目的。 – justiceorjustus

+0

查看我的編輯以獲取更多信息。 –

+0

感謝您的信息!這只是我的第二個MVC項目,我喜歡kudvenkat的視頻!我覺得我的問題是它是我的數據庫中必需的NOT NULL字段,所以當我嘗試將它包含在綁定中時,它會嚇壞了,但也隱藏在窗體上。我對麼? – justiceorjustus