5

自動生成された Entity Framework モデルがあります。これは、データベース ファーストのアプローチを使用して生成されました。列には、mid_initial列を最大 3 文字に制限するデータベース定義の制約があります。

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Agency.DataAccess.RegistrationModel
{
    using System;
    using System.Collections.Generic;

    public partial class Registrant
    {
        public Registrant()
        {
        }

        public int id { get; set; }
        public string fname { get; set; }
        public string mid_initial { get; set; }
        public string lname { get; set; }
    }
}

mid_initial3 文字を超えるモデルを作成しようとすると、無効な状態ModelState.IsValidが true を返します。このため、db.SaveChangesが呼び出され、 が発生しDbEntityValidationExceptionます。

[HttpPost]
public ActionResult Create(Registrant registrant)
{    
    try
    {
        if (ModelState.IsValid)
        {
            Debug.WriteLine("Entity was valid.");
            db.Registrants.Add(registrant);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View("Create", registrant);
    }
    catch (DbEntityValidationException e)
    {
        foreach (var eve in e.EntityValidationErrors)
        {
            Debug.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                eve.Entry.Entity.GetType().Name, eve.Entry.State);
            foreach (var ve in eve.ValidationErrors)
            {
                Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                    ve.PropertyName, ve.ErrorMessage);
            }
        }
        return View(registrant);
    }
}

ModelState.IsValidメソッドが true を返すのはなぜですか? 私のモデルは最大長の制約を認識していないようです。どのように認識させるのですか?

4

2 に答える 2

3

MVC は EF に依存しないため、EF 検証を使用して暗黙的にモデルの検証を試みて ModelState を設定することはありません。

現在考えられる基本的な解決策は次の 4 つです。

  • たとえば、MVC フィルター、DbContext.GetValidationErrors、および ModelState を使用して、それらを自分で接続します。
  • すでにこれを行っているサードパーティのコードを見つけて使用してください。
  • DataAnnotations など、MVC が使用できる機能を使用してコードを個別に検証します。EF T4 テンプレートを変更して、それらを自動的に生成しようとする場合があります。これはまだ技術的に冗長であることに注意してください (コードは MVC によって 1 回、EF によって 1 回、合計 2 回検証されます)。
  • MVC のパッチを提出して、EF を明示的に (ソフトな依存関係として) サポートし、すべてが機能するようにします (どちらのプロジェクトもオープン ソースです)。
于 2013-07-30T16:15:38.140 に答える