在尝试使用 EF CodeFirst/Mvc3 为我的数据库实现唯一密钥验证时,我发现了这篇文章http://blogs.msdn.com/b/adonet/archive/2011/05/27/ef-4-1 -validation.aspx举例说明了如何通过使用IValidateObject
我的对象模型来做到这一点:
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"];
似乎正在调用对象上的 Validate,该对象在覆盖 ValidateEntity 代码中设置之前访问“上下文”。
起初我认为它可能是 ModelState.Isvalid 太早触发验证,但事实并非如此。
任何人都知道我在这里缺少什么或我做错了什么?提前致谢。