Хитрость заключается в том, чтобы не использовать любые атрибуты ObjectValidator
и ObjectCollectionValidator
. Вы можете проверить все объекты самостоятельно. Это не всегда выполнимо, но особенно хорошо работает в контексте сценариев O / RM, где инфраструктура O / RM знает, какие объекты являются новыми или изменились.
Посмотрите, например, на этот пример, где проверка запускается непосредственно перед отправкой изменений в базу данных с использованием Entity Framework:
public partial class NorthwindEntities
{
partial void OnContextCreated()
{
// Adding validation support when saving.
this.SavingChanges += (sender, e) =>
{
// Throws an exception when invalid.
EntityValidator.Validate(
this.GetChangedEntities());
}
}
private IEnumerable<object> GetChangedEntities()
{
const EntityState AddedAndModified =
EntityState.Added | EntityState.Modified;
var entries = this.ObjectStateManager
.GetObjectStateEntries(AddedAndModified);
return
from entry in entries
where entry.Entity != null
select entry.Entity;
}
}
Код подключается к событию ObjectContext
SavingChanges
.
EntityValidator
- это пользовательский класс, который позволяет проверять группу объектов с помощью блока проверки приложения. Когда проверка завершается неудачей, она выбрасывает пользовательский ValidationException
, который упаковывает коллекцию ValidationResults
.
static class EntityValidator
{
public static void Validate(IEnumerable<object> entities)
{
ValidationResults[] invalidResults = (
from entity in entities
let type = entity.GetType()
let validator = ValidationFactory.CreateValidator(type)
let results = validator.Validate(entity)
where !results.IsValid
select results).ToArray();
// Throw an exception when there are invalid results.
if (invalidResults.Length > 0)
{
throw new ValidationException(invalidResults);
}
}
}
Подробнее здесь .
Надеюсь, это поможет.