EF CodeFirst / Mvc3を使用してデータベースに一意のキー検証を実装しようとしているときに、この投稿に出くわしましたhttp://blogs.msdn.com/b/adonet/archive/2011/05/27/ef-4-1 -validation.aspxIValidateObject
は、オブジェクトモデルに使用してそれを行う方法の例を示しています。
public class Category : IValidatableObject
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
public string Description { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var testContext = (TestContext)validationContext.Items["Context"];
if (testContext.Categories.Any(
c => c.CategoryName == CategoryName && c.CategoryID != CategoryID))
{
yield return new ValidationResult("A category with the same name already exists!", new[] { "CategoryName" });
}
yield break;
}
}
とオーバーライドDbEntityValidationResult ValidateEntity
:
public class TestContext : DbContext
{
public DbSet<Test.Models.Category> Categories { get; set; }
protected override DbEntityValidationResult ValidateEntity( DbEntityEntry entityEntry, IDictionary<object, object> items)
{
var myItems = new Dictionary<object, object>();
myItems.Add("Context", this);
return base.ValidateEntity(entityEntry, myItems);
}
}
そして、コントローラーのアクション
[HttpPost]
public ActionResult Create(Category category)
{
if (ModelState.IsValid) {
categoryRepository.InsertOrUpdate(category);
categoryRepository.Save();
return RedirectToAction("Index");
} else {
return View();
}
}
しかし、私はエラーを受け取ります:"The given key was not present in the dictionary."
行のために
var testContext = (TestContext)validationContext.Items["Context"];
オーバーライドValidateEntityコードで設定される前に、「Context」にアクセスするオブジェクトのValidateが呼び出されているようです。
最初は、ModelState.Isvalidトリガーの検証が早すぎる可能性があると思いましたが、そうではありませんでした。
私がここで何が欠けているのか、何が間違っているのか誰かが知っていますか?前もって感謝します。