2010-12-09 46 views
1

J'utilise Entity Framework 4 et un site de données dynamiques pour exposer une interface d'administration simplifiée à quelques utilisateurs. Travailler assez bien en général, mais j'ai rencontré ce problème sur un couple de champs sur mon modèle.Prévention de la validation dans Entity Framework 4

Plusieurs tables ont des champs liés à l'audit: CreatedBy, CreatedDate, ModifiedBy et ModifiedDate. Ces champs sont obligatoires dans la base de données et les modèles associés marquent les propriétés comme non nulles (tout ce qu'il devrait être). Cependant, je suis en train de définir les valeurs de ces champs dans le code - les modèles de champ pour les types de champs marquent ces champs spécifiques comme désactivés sur la page, et dans l'événement SavingChanges je définis ces champs sur les valeurs appropriées. Tout fonctionne super lorsque je mets à jour un élément existant.

Le problème survient lorsque j'essaie de créer un nouvel élément. Je veux que ces champs restent vides sur la page et soient automatiquement remplis par mon code lors de la soumission, mais les modèles de champs configurent RequiredFieldValidators pour ces champs et ne me laisseront pas les soumettre sans valeur. Normalement, ce serait génial, sauf que je veux empêcher EF de valider ces champs au moment de la soumission de la page. Je me rends compte que je pourrais marquer les champs comme nullables dans la base de données et que cela résoudrait le problème - ce serait probablement très bien du point de vue des données, mais je ne suis pas à l'aise de le faire - pour une chose c'est Il n'est pas improbable que certains des modèles de ces champs apparaissent en masse, éventuellement par quelqu'un d'autre, à une date ultérieure. Je préférerais que la base de données applique la non-nullité de ces champs. Dans les modèles de champs, j'ai essayé de déplacer l'appel intégré SetUpValidator() pour que RequiredFieldValidator ne s'exécute pas lorsque ces champs spécifiques sont chargés, et j'ai également essayé de désactiver les RequiredFieldValidators et de forcer leur propriété IsValid à true. Aucune de ces actions ne me permet de soumettre la page.

Existe-t-il un moyen de dire à EF/Dynamic Data d'ignorer la validation pour certains champs?

EDIT

Comme il est indiqué ci-dessous, j'ai essayé aussi les marquer annulable dans le modèle et non pas dans la base de données, ce qui a provoqué une erreur: Problem in mapping fragments...Non-nullable column...in table...is mapped to a nullable entity property.

EDIT # 2

I J'ai trouvé une solution qui fonctionne, mais nécessite de modifier le fichier du concepteur généré automatiquement pour l'ensemble d'entités, ce qui est au mieux fragile. J'aimerais savoir comment le faire, mais si rien n'apparaît dans les prochains jours, je posterai ma propre réponse.

+0

Pourquoi ne pas les marquer comme nullable dans votre modèle et non-nullable dans la base de données. Est-ce que ça ne marchera pas? – Steven

+0

Déjà essayé cela (oublié de le mettre dans ma liste) et non - alors je reçois des erreurs que le modèle a des champs nullables qui ne sont pas valables dans la base de données. Merci quand même! – cori

+0

Avez-vous déjà trouvé une bonne solution pour cela? J'ai le même problème et je ne peux pas croire que tout le monde utilisant EF et les champs CreatedDate autogénérés ne le soit pas non plus. – EdenMachine

Répondre

1

Voici donc les modifications que j'ai trouvées à faire. Lorsque vous autorisez l'outil à créer les entités dans edmx Designer.fichier cs je reçois des propriétés comme celles-ci:

pour un datetime sur le côté serveur

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
[DataMemberAttribute()] 
public global::System.DateTime CreatedDate 
{ 
    get 
    { 
     return _CreatedDate; 
    } 
    set 
    { 
     OnCreatedDateChanging(value); 
     ReportPropertyChanging("CreatedDate"); 
     _CreatedDate = StructuralObject.SetValidValue(value); 
     ReportPropertyChanged("CreatedDate"); 
     OnCreatedDateChanged(); 
    } 
} 

pour un varchar

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
[DataMemberAttribute()] 
public global::System.String CreatedBy 
{ 
    get 
    { 
     return _CreatedBy; 
    } 
    set 
    { 
     OnCreatedByChanging(value); 
     ReportPropertyChanging("CreatedBy"); 
     _CreatedBy = StructuralObject.SetValidValue(value, false); 
     ReportPropertyChanged("CreatedBy"); 
     OnCreatedByChanged(); 
    } 
} 

Pour le faire fonctionner sans validation pour une propriété DateTime définissant le paramètre IsNullable de l'EdmScalarPropertyAttribute à true est suffisant pour éviter le problème. Pour la propriété String, vous devez également modifier le deuxième paramètre de l'appel de la méthode SetValidValue à "true". Tout cela dit, la seule raison pour laquelle je pars comme ça c'est parce que je ne m'attends pas à devoir régénérer les entités plus d'une ou deux fois avant de passer à une plate-forme différente pour ce site. Et dans ce cas, la fusion de la version dans Git avec la version générée par l'outil me permet d'éviter la plupart des maux de tête,

+0

Savez-vous comment le faire avec des bits et des booléens? J'obtiens cette erreur et j'ai changé 'isNullable' en false et ai enlevé tous les préfixes Nullable de la variable dans le dossier de concepteur généré mais j'obtiens toujours cette erreur de construction. – Johannes

+0

Je n'ai pas beaucoup travaillé avec Dynamic Data ou EF depuis que j'ai posté cette réponse, donc je crains de ne pouvoir valider quoi que ce soit, mais je ne pense pas que les préfixes nullables puissent faire la moindre différence, et au moins Dans mon cas, je devais définir la valeur IsNullable sur true, car je ne voulais pas qu'EF valide la nullité des champs. – cori

0

Voici mes informations méta pour un champ de date généré automatiquement en lecture seule. Je n'ai pas de contrôles de validation validant ces champs. J'espère que cela t'aides.

[ReadOnly(true)] 
[DataType(DataType.Date)] 
[Column(IsDbGenerated = true, UpdateCheck = UpdateCheck.Never, AutoSync = AutoSync.Never)] 
[UIHint("DateTime")] 
[Display(Name = "Modified", Order = 1000)] 
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] 
public object DateModified { get; private set; } 
+0

merci @Ash. Par curiosité, à quoi ressemblent vos champs à la fin db? Sont-ils requis dans le tableau? – cori

+0

À la fin de la base de données, il n'y a rien de tel que requis, mais certains ne sont pas NULLABLE. Ce champ généré par db ne peut pas être validé avec une valeur par défaut comme contrainte. Tout dépend de ce que vous essayez de faire appliquer. –

+0

On dirait que vous utilisez LINQ to SQL, pas LINQ to Entities. Les paramètres de l'attribut de colonne semblent prometteurs, mais je ne pense pas qu'ils soient pertinents dans mon cas. – cori