J'ai une propriété "Identification" ajoutée par l'utilisateur qui ne doit pas être dupliquée. (différent de l'identifiant de base de données).Ignorer la recherche de doublons pour des propriétés spécifiques lors de la modification du modèle
J'ai ajouté la méthode suivante à mon ViewModel:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
GearContext db = new GearContext();
if (db.Items.Where(p => p.Identification == this.Identification).Count() > 0)
{
yield return new ValidationResult("Identification already in use, please chose a different one. ", new[] { "Identification" });
}
}
Le problème est que cela me empêche de modifier mon modèle. Je voudrais que cette validation se produise seulement quand une nouvelle entrée est créée, pas sur éditer.
J'ai essayé le type d'édition suivante dans mon contrôleur:
if (ModelState.IsValid)
{
var item = db.Items.Find(viewModel.ItemId);
Mapper.Map<ItemViewModel, Item>(viewModel, item);
if (TryUpdateModel(item, null, null, new string[] { "Identification" }))
{
db.SaveChanges();
return RedirectToAction("Index");
}
}
aussi essayé sans le "TryUpdateModel" du tout (simple, viewmodel => modèle et db.save). J'ai pensé à implémenter la méthode de validation dans mon contexte DB et l'exécuter uniquement sur item.State == EntityState.Added mais je crois que je n'ai pas accès aux propriétés du modèle édité ici.
Ne serait-il pas plus facile d'avoir une identification dans le cadre d'une clé unique sur la table pertinente et de laisser tout cela au SGBD? Même si vous implémentez cela dans MVC, une application de console ou un service Windows pourrait encore casser cette logique. L'avoir dans la DB signifie que rien ne peut. – barrick
Est-il possible de définir une clé unique avec du code en premier? Aussi, n'aurais-je pas le même problème? Je me sens comme c'est la façon dont je mets à jour mon modèle qui pourrait être faux (il ne devrait pas toucher Identification/Id du tout). –
Ce n'était certainement pas possible auparavant; vous voudrez peut-être vérifier EF6 pour voir si cela a été changé. Cependant, pour rester dans MVC, avez-vous des vues Create et Edit séparées? Vraisemblablement, Si tel est le cas, ayez des modèles de vue séparés pour chacun d'entre eux et utilisez le contrôleur pour créer des instances de ceux-ci lorsque la requête GET pertinente entre en jeu. Le modèle Create peut alors contenir cette validation alors que le modèle Edit peut l'avoir comme propriété immuable. besoin de la vérification. – barrick