Bonjour,
Je tiens a vous faire part d'une "bizarrerie d'EF" que j'ai remarqué ...
Je créé une surcouche d'EF dans un projet de classe avec une approche "framework" où j'ai hérité d'ObjectContext.
Lorsque je met un appel de la méthode "TryGetObjectByKey" dans ma classe hérité d'ObjectContext j'ai le droit a une grosse erreur du type:
Alors j'ai créé une méthode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Server Error in '/' Application. 'Id' is not a member of type 'Objects.TransferenceType' in the currently loaded schemas., near multipart identifier, line 1, column 68.
Que j'appel au lieu d'appeler le getobjectbykey et je l'ai overridé dans la classe qui hérite de cette objet dans mon projet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public virtual bool TryGetObjectByKey2(EntityKey key, out object obj) { throw new NotImplementedException(); }
Et la cela fonctionne ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public override bool TryGetObjectByKey2(EntityKey key, out object obj) { return base.TryGetObjectByKey(key, out obj); }
Je me suis vraiment demander pourquoi et comment et avec un coup de reflector j'ai regardé le code du trygetobjectbykey et voici une ligne qui doit être la coupable :
Et bien je suis déçu ... a priori il cherche la metadata de l'edmx dans l'assembly appelante sauf que la il ne peut pas l'avoir vu que l'appel se faisait dans l'assembly de framework, la où aucun edmx n'est défini ...
Code : 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 public bool TryGetObjectByKey(EntityKey key, out object value) { ObjectStateEntry entry; this.ObjectStateManager.TryGetObjectStateEntry(key, out entry); if ((entry != null) && !entry.IsKeyEntry) { value = entry.Entity; return (value != null); } if (key.IsTemporary) { value = null; return false; } EntitySet entitySet = key.GetEntitySet(this.MetadataWorkspace); key.ValidateEntityKey(entitySet, true, "key"); this.MetadataWorkspace.LoadFromEntityType(entitySet.ElementType, Assembly.GetCallingAssembly()); StringBuilder builder = new StringBuilder(); builder.AppendFormat("SELECT VALUE X FROM {0}.{1} AS X WHERE ", QuoteIdentifier(entitySet.EntityContainer.Name), QuoteIdentifier(entitySet.Name)); EntityKeyMember[] entityKeyValues = key.EntityKeyValues; ReadOnlyMetadataCollection<EdmMember> keyMembers = entitySet.ElementType.KeyMembers; ObjectParameter[] parameters = new ObjectParameter[entityKeyValues.Length]; for (int i = 0; i < entityKeyValues.Length; i++) { if (i > 0) { builder.Append(" AND "); } string str = string.Format(CultureInfo.InvariantCulture, "p{0}", new object[] { i.ToString(CultureInfo.InvariantCulture) }); builder.AppendFormat("X.{0} = @{1}", QuoteIdentifier(entityKeyValues[i].Key), str); parameters[i] = new ObjectParameter(str, entityKeyValues[i].Value); EdmMember item = null; if (keyMembers.TryGetValue(entityKeyValues[i].Key, true, out item)) { parameters[i].TypeUsage = item.TypeUsage; } } object obj2 = null; foreach (object obj3 in this.CreateQuery<object>(builder.ToString(), parameters).Execute(MergeOption.AppendOnly)) { obj2 = obj3; } value = obj2; return (value != null); }
Bref je trouve ceci très dommage! Je ne pense pas qu'il y ait de solution adéquate pour mon problème (qui est que je n'aime pas des masse cette surcouche de ma méthode a refaire dans tous mes projets) mais j'aimerais savoir ce que vous en pensez, est ce que vous croyez que c'est une erreur du framework (EF ou de vouloir en faire une surcouche) où est ce que vous trouvez cela normal.
Merci![]()
Partager