Je suis très nouveau à EF4. J'ai posté quelques fois je pense en ce qui concerne l'héritage, la validation mais mon objectif global est de réduire autant que possible la quantité de code que j'écris. Je ne m'intéresse pas (encore) aux POCOs, aux masses de bidouillage ObjectContext: je veux profiter du EF et du minimum de codage. Donc, l'épineux problème de la validation. Jetez un oeil à cet exemple simplifié et (à part les alias DRY Buddies et usages douteux), cela ressemble-t-il à une approche à moitié décente?Valider cette approche de validation EF4?
namespace Model
{
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using DataAnnotations = System.ComponentModel.DataAnnotations;
using Validation = Microsoft.Practices.EnterpriseLibrary.Validation;
[HasSelfValidation]
[DataAnnotations.MetadataType(typeof(PersonValidator))]
public partial class Person
{
[SelfValidation]
public Validation.ValidationResults Validate()
{
var validationResults = Validation.Validation.Validate(this);
if (string.IsNullOrEmpty(this.LastName) || this.LastName.Length > 4)
{
validationResults.AddResult(new Validation.ValidationResult("This is a test error message for a custom validation error.", this, null, null, null));
}
return validationResults;
}
}
[HasSelfValidation]
public class PersonValidator
{
[NotNullValidator(MessageTemplate = "First Name must be supplied.")]
[ContainsCharactersValidator("Rcd", ContainsCharacters.All, MessageTemplate = "{1} must contains characters \"{3}\" ({4}).")]
[StringLengthValidator(5, 50, MessageTemplate = "{1} (\"{0}\") must be between {3} ({4}) and {5} ({6}) characters in length.")]
public string FirstName { get; set; }
[NotNullValidator(MessageTemplate = "Last Name must be supplied.")]
[ContainsCharactersValidator("Wes", ContainsCharacters.All, MessageTemplate = "{1} must contains characters \"{3}\" ({4}).")]
[StringLengthValidator(5, 50, MessageTemplate = "{1} (\"{0}\") must be between {3} ({4}) and {5} ({6}) characters in length.")]
public string LastName { get; set; }
}
}
Il y a quelque chose de plutôt cool à ce sujet. Je peux appeler ce qui précède comme ceci:
var validationResults = person.Validate();
MAIS, si je veux juste quelques vérifications de base, je peux dépouiller Valider(), la substance [de SelfValidation], conserver les attributs et il suffit d'appeler:
var validationResults = Validation.Validate(person);
J'ai juste besoin d'inclure autant de validation que nécessaire et il y a une configuration ZERO dans web.config.
Comment est la coupe de mon foc? :)
Richard
personnellement, je ne pense pas que vous devriez valider dans votre modèle pour des choses comme "longueur du nom de famille". C'est la validation de * input *, ce qui devrait être fait dans le niveau présentation. La validation de dernière minute devrait être faite par EF lui-même qui validera les champs par rapport aux contraintes de base de données sous-jacentes (par exemple 'NVARCHAR (4)' - qui empêche tout caractère> 4 caractères). À quel moment de votre application appelez-vous 'person.Validate'? – RPM1984
Comme je l'ai dit, un exemple simple. Imaginez-le dans le contexte d'une application du monde réel avec validation du monde réel qui prendrait trop de temps à coder par exemple. – Richard
Je suppose (encore simplement!) Appeler comme: using (var contexte = nouveau ModelContainer()) {var personne = new Personne(); var validationResults = Validation.Validate (personne); if (validationResults.IsValid) {context.AddToPeople (personne); } else {WriteValidationResults (validationResults); }} mais ce truc EF est encore nouveau pour moi, alors ... – Richard