В поисках попыток реализовать уникальные проверки ключей для моей базы данных с помощью 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 для объекта, который обращается к «Context» до его установки в коде переопределения ValidateEntity.
Сначала я подумал, что это мог быть ModelState. Недействительный запуск проверки слишком рано, но это не так.
Кто-нибудь знает, что мне здесь не хватает или что я делаю не так? Заранее спасибо.