Да, я считаю, что реализация реализации IValidatableObject в моделях POCO имеет смысл. И вы, вероятно, заметили public ObservableCollection<TEntity> Local { get; }
Существует несколько способов сделать это. Так что домашнее задание.
As some background , might be useful
Then check this out
Итак, мы знаем EF имеет концепцию запуска Validations.
Configuration.ValidateOnSaveEnabled = true;
EF также называют IEnumerable<ValidationResult> ValidateInstance();
из интерфейса IValidatableObject
если ваша организация ПОКО реализует IValidatableObject
EF инициирует проверку на СОХРАНИТЬ. Вы также можете легко запускать проверки, когда вам нужно.
Все это полностью связано с концепцией UoW.
public IEnumerable<DbEntityValidationResult> GetDbValidationErrors() { return
Context.GetValidationErrors(); } // Standard Context call get the problems
, которые могут быть использованы улов (Исключение экс) {.... вар х = GetDbValidationErrors(); // ....
Так я думаю, что вы на правильном пути ...
EDIT: Добавить SAMPLE POCOBase и демонстрации проверки триггера.
public interface IFBaseObject : IValidatableObject {
// a POCO object must implement the VALIDATE method from IValidatableObject
bool IsValidInstance();
IEnumerable<ValidationResult> ValidateInstance();
}
public abstract class BaseObject : IFBaseObject {
// .... base object stuff removed....
/// <summary>
/// Get called every a Validation is trigger on an object. Here we return and Empty resultset to start with.
/// If you override ALWAYS call Base first and Continue to add your own results as desired.
/// Never fail to call base First !
/// </summary>
public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
# region Sample implementation for a POCO thats needs validation
/* Sample Implementation a sub type POCO might use.
var validationResult = base.Validate(validationContext).ToList();
if (true) // the condition that leads to a validation error
{
var memberList = new List<string> { "PropertyName" }; // the name of the offending property
var error = new ValidationResult("Error text goes here", memberList); // use teh textpool !!! no hardcoded texts
validationResult.Add(error);
}
return validationResult;
*/
# endregion
// now back in the base Class.
var validationResult = new List<ValidationResult>();
// hand back a list that is empty so errors if any can be added by SUBclasses
// we can check any Poco that implements a certain interface centrally.
var thisIsKeyGuid = this as IFKeyGuid;
if (thisIsKeyGuid != null) {
if (thisIsKeyGuid.Id == Guid.Empty) {
validationResult.Add(new ValidationResult("Id is required", new List<string>() {"Id"}));
}
}
return validationResult;
}
/// <summary>
/// Allows explicit triggering of Validation and returns a TRUE or false answer. Call anytime
/// </summary>
/// <returns></returns>
public virtual bool IsValidInstance() {
List<ValidationResult> vResults;
return SelfValidation(out vResults);
}
/// <summary>
/// Calls Self Validation which uses THIS object as the context for validation.
/// This means you can trigger a validation without first declaring a validation context.
/// IValidatableObject is effectively called for you. Witch causes "Validate" to be called
/// </summary>
/// <returns></returns>
public IEnumerable<ValidationResult> ValidateInstance() {
List<ValidationResult> vResults;
SelfValidation(out vResults);
return vResults;
}
/// <summary>
/// Although SelfValidation is defined at BaseObject level, this triggers the VALIDATION process on the current Object
/// see http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validator.aspx for mroe details
/// So if a POCO Object has overridden public virtual IEnumerable of ValidationResult Validate(ValidationContext validationContext)
/// then this method will be called. It should of course call :base.Validate
/// </summary>
/// <returns>true or false</returns>
private bool SelfValidation(out List<ValidationResult> vResults) {
var vc = new ValidationContext(this, null, null);
vResults = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(this, vc, vResults, true);
return isValid;
}
}
Это мыслящий клиент.Существуют ли какие-либо альтернативы, которые не связаны с реализацией интерфейса на самих моделях? – Cocowalla
@cocowalla Хорошо, потому что вы обращаетесь к этим объектам из локального кеша, я считаю, что альтернативы нет, и эта логика проверки будет привязана к классам моделей, которая считается хорошей практикой многих разработчиков, и они являются интерфейсами, поэтому вы по-прежнему можно получить из других базовых классов, если хотите. –