Bonjour,
J'aimerais tester mes enregistrements avant de les envoyer dans SQL Server et éviter les doublons
Je n'ai pas trouvé de fonction pour cela dans EF5, et j'ai donc repris un code trouvé dans un bouquin en surchargeant la validation pour chaque classe
Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 Protected Overrides Function ValidateEntity(ByVal entityEntry As Entity.Infrastructure.DbEntityEntry, ByVal items As IDictionary(Of Object, Object)) As DbEntityValidationResult Dim result = New DbEntityValidationResult(entityEntry, New List(Of DbValidationError)()) ' les tests par propriété sont réalisés dans la classe ' A priori Nullable et Maxlenght sont gérés par par EF ''test unicité du libellé -> ce test ne doit être effectué que si EntityState.Added, sinon erreur dès modification, le test est fait sur base locale (plusieurs lignes ss enregistrement) et distante '' Pb si on teste également les modified car leur type devient proxy : ' exemple : HistoAction -> System.Data.Entity.DynamicProxies.HistoAction_33F4B4452EB9B48D8D7617671B4CD5EBC47CCA7C366ABBECC1DB08FD54CC99C8 If entityEntry.State = EntityState.Added Then NomClasse = entityEntry.Entity.GetType.Name Select Case entityEntry.Entity.GetType Case GetType(Activite) Dim Act As Activite = TryCast(entityEntry.Entity, Activite) 'test unicité du libellé IDDoublon = Act.ActiviteID CritereDoublon = Act.Libelle NbreOccuranceLocal = Activites.Local.Where(Function(l) l.Libelle = Act.Libelle).Count() If NbreOccuranceLocal > 1 Then result.ValidationErrors.Add(New Entity.Validation.DbValidationError(MessageErreurDebut, "Doublon : Le libellé doit être unique, Nombre Occurances locales = " & NbreOccuranceLocal)) Else NbreOccuranceBase = Activites.Where(Function(l) l.Libelle = Act.Libelle).Count() If NbreOccuranceBase > 0 Then result.ValidationErrors.Add(New Entity.Validation.DbValidationError(MessageErreurDebut, "Doublon : Le libellé doit être unique, Nombre Occurances dans base = " & NbreOccuranceBase + 1)) End If End If ' et ainsi de suite pour chaque classe à tester Case Else result.ValidationErrors.Add(New Entity.Validation.DbValidationError("Non retrouvé dans Select Case de PhilaEntities !", "Validation de la classe " & entityEntry.Entity.GetType.ToString & " non effectuée !")) End Select End If If result.ValidationErrors.Count > 0 Then Return result Else Return MyBase.ValidateEntity(entityEntry, items) End If End Function
ce code marche très bien pour tout ajout (EntityState.Added) mais pas pour les modifications (EntityState.modified) car les GetType ne "fonctionnent plus" , exemple erreur :
Je pense que cela est du aux POCO
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.Data.Entity.DynamicProxies.HistoAction_33F4B4452EB9B48D8D7617671B4CD5EBC47CCA7C366ABBECC1DB08FD54CC99C8
Comment contourner ce problème, ou autre moyen de tester l'unicité ?
par avance, merci
Bertrand
Partager