2010-10-21 6 views
0

Envisagez la situation suivante. J'ai une entité nommée ProductSupplier qui est un modèle de présentation. Il est créé en faisant une jointure interne de Produits et Fournisseurs et en créant une nouvelle projection à partir d'une instruction Linq. La projection ProductSupplier crée également une liste d'objets PartType, qui est également un modèle de présentation.Propriétés de l'association sur l'entité non chargée pour la validation côté serveur

public partial class ProductSupplier 
{ 
    private IEnumerable<PartType> _partTypes; 

    [Key] 
    public int ProductSupplierKey { get; set } 

    [Include] 
    [Association("ProductSupplier_PartType", "ProductSupplierKey", "ProductSupplierKey")] 
    public IEnumerable<PartType> PartTypes 
    { 
     get { return _partTypes ?? (_partTypes = new List<PartType>()); } 
     set { if (value != null) _partTypes = value; } 
    } 
} 

public partial class PartType 
{ 
    [Key] 
    public int PartTypeKey { get; set; } 

    [Key] 
    public int ProductSupplierKey { get; set; } 

    public int PartQuantity { get; set; } 
} 

Je veux avoir une validation qui est pas ProductSupplier peut avoir plus de 10 parties distinctes. Cela signifie que tous les PartQuantities pour tous PartTypes qui appartiennent à un ProductSupplier doivent être additionnés et le total ne peut pas dépasser 10.

Pour cela, je créé un validateur personnalisé:

public static ValidationResult ValidatePartTotals(ProductSupplier productSupplier, ValidationContext validationContext) 
{ 
    if (productSupplier.PartTypes.Sum(p => p.PartQuantity) > 10) 
     return new ValidationResult("Must be less than 10 parts total."); 

    return ValidationResult.Success; 
} 

Cela fonctionne bien quand la validation est appelée du côté du client. Le problème que j'ai est que quand le validateur est exécuté du côté du serveur, le IEnumerable est toujours vide.

J'ai essayé d'ajouter [RoundTripOriginal] à PartQuantity, et à diverses autres propriétés, telles que tous les champs clés, mais il s'agit toujours d'une liste vide lorsque vous avez terminé côté serveur.

Comment puis-je accéder à ces objets PartType lorsque la validation est exécutée sur le serveur?

Répondre

0

Malheureusement, vous n'avez aucune garantie quant à l'état du graphe d'objet lorsqu'il vous parvient sur le serveur. RIA optimise les choses pour ne voir que les entités modifiées. Une solution serait d'utiliser la composition. Il s'assurera que tout le graphique est transmis, mais il a d'autres effets qui peuvent ne pas être ce que vous voulez. Une autre option consisterait à hydrater le graphique dans votre méthode de mise à jour, puis à effectuer une validation et à lancer une exception ValidationException si nécessaire.

+0

J'ai accepté ceci comme réponse. Je veux juste qu'il soit clair pour quiconque cherchant cette réponse: attribuer votre propriété avec [Composition] au lieu de [Association] forcera le graphe d'objet entier à être renvoyé au service. – robertkroll