2016-08-19 10 views
0

マイモデルには、レコード作成時に自動的に生成されるタイムスタンプ列があります。私はRazor構文でデフォルトのCRUD足場を使用しています。現時点では、私はちょうどプロジェクトを開始しているので、エンティティフレームワークを使用してVisual Studioから基本的に生成されたコントローラとビューが生成されます。MVC/EF DBファーストと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> 

作成ビューで新しいレコードを作成しようとすると、フィールドが必須か、TimeStampフィールドにnullが書き込まれています。私は私の問題は、私はコントローラやビューで自動生成フィールドを処理する方法がわからないと思う。そのようなフィールドを持つレコードを作成する方法や、特定のデータ注釈を追加する必要がある場合は誰でも手伝ってください。

+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を挿入しますが、あなたのフィールドには、ちょうどEF INSERTクエリからパラメータをOMMIT代わりに

NOT NULLを言っていますさ。だから、デフォルトが引き継ぐ。

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

フィールドは常にEF側で設定できます。

Model.TimeStamp = DateTime.Now; 

EDIT:

([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

情報ありがとう!これは私の2番目のMVCプロジェクトです。私はkudvenkatのビデオが大好きです!私の問題は、それが私のデータベースに必要なNOT NULLフィールドだと思うので、私はバインドに含めるようにしようとすると気になるだけでなく、フォーム上にも隠してしまいます。私は正しいですか? – justiceorjustus