Bonsoir,
J'ai un problème d'assemblage quelque peu étrange.
Situation :
J'ai une solution avec plusieurs projets dedans :
1 - Une DAL (Data Access Layer)
2 - Un métier
3 - Un service (enfin pas encore, pour le moment c'est une application console qui sera mise en service par la suite)
J'utilise Entity Framework Core 3.1.10.
Ayant utilisé Entity Framework 6.0 fût un temps autre, on pouvait remplir les données initiales dans le projet. Cette organisation n'est plus avec EFCore, j'ai donc fait une "verrue" pour la remplir si une table était détectée vide (verrue faite dans le constructeur DalContext afin d'assurer le remplissage de la base avant sa première utilisation).
Tout fonctionne à merveille... Ca fait 3 mois que cela fonctionne même...
Mais la verrue n'est pas du goût du chef de projet et il m'a demandé de faire un projet d'initialisation à part. J'ai donc fait ce projet où j'ai récupéré tout ce qui était dans mon constructeur et ai vidé ma verrue, mon constructeur est réduit à peau de chagrin par la vérification de la table pour générer un message d'erreur au cas où la base serait vide.
Bien, maintenant, j'exécute le projet initiale (ma base est déjà remplie) => Tout se passe toujours bien
Je lance maintenant mon initialisation (qui peut aussi vider la base de données pour la re-remplir) et dans mon constructeur DalContext, lors du contrôle de la table remplie ou non (avec un .Count()), j'ai le message d'erreur suivant (dans l'InnerException) :
Au cas où ce soit utile, l'exception est :Impossible de charger le fichier ou l'assembly 'Microsoft.EntityFrameworkCore.Relational, Version=3.1.10.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' ou une de ses dépendances. La définition trouvée du manifeste de l'assembly ne correspond pas à la référence de l'assembly. (Exception de HRESULT : 0x80131040)
Pourquoi cela me fait ça quand je viens du projet d'initialisation et pas du projet d'exécution ?Une exception a été levée par la cible d'un appel.
Voici en supplément :
1 - Le FusionLog
2 - La StackTrace :=== Informations d'état de liaison préalable ===
JRN*: DisplayName = Microsoft.EntityFrameworkCore.Relational, Version=3.1.10.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
(Fully-specified)
JRN*: Appbase = file:///C:/Users/xxx/source/repos/MaSolution/MonProjetIntialisation/bin/Debug/
JRN*: PrivatePath initial = NULL
Assembly appelant*: MaDAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
JRN*: cette liaison démarre dans le contexte de chargement de default.
JRN*: utilisation du fichier de configuration de l'application*: C:\Users\xxx\source\repos\MaSolution\MonProjetIntialisation\bin\Debug\MonProjetIntialisation.exe.Config
JRN*: utilisation du fichier de configuration d'hôte*:
JRN*: utilisation du fichier de configuration de l'ordinateur à partir de C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
JRN*: référence post-stratégie*: Microsoft.EntityFrameworkCore.Relational, Version=3.1.10.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
JRN*: tentative de téléchargement de la nouvelle URL file:///C:/Users/xxx/source/repos/MaSolution/MonProjetIntialisation/bin/Debug/Microsoft.EntityFrameworkCore.Relational.DLL.
AVT*: la comparaison du nom de l'assembly a entraîné l'incompatibilité*: Numéro de build
ERR*: impossible de terminer l'installation de l'assembly (hr = 0x80131040). Détection terminée.
Déjà la StackTrace m'envoie sur une ligne alors allons-y =>Stupeur : c'est l'accolade de fermeture de la méthode Configure !!!à MonProjetDAL.EntityTypeConfiguration.NNLinksConfiguration.Configure(EntityTypeBuilder`1 builder) dans C:\Users\xxx\source\repos\MaSolution\MonProjetDAL\EntityTypeConfiguration\NNLinksConfiguration.cs :ligne 56
à Microsoft.EntityFrameworkCore.ModelBuilder.ApplyConfiguration[TEntity](IEntityTypeConfiguration`1 configuration)
Je la met ici au cas où cela puisse être utile :
Code C# : 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
47
48
49
50
51
52
53
54
55
56
57
58 using MonProjetDAL.Persistence; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using System; using System.Linq; namespace MonProjetDAL.EntityTypeConfiguration { /// <summary> /// Configuration de l'association de 2 objets avec un lien N-N des 2 entités /// </summary> /// <typeparam name="Object1">Object1</typeparam> /// <typeparam name="Object2">Object2</typeparam> public class NNLinksConfiguration : IEntityTypeConfiguration<NNLink> { public void Configure(EntityTypeBuilder<NNLink> builder) { // Code générique builder.HasKey(o => new { o.Identifier1ID, o.Identifier2ID }); var identifier = nameof(Identifier); var id = nameof(Identifier.ID); var links = builder.GetType() .GenericTypeArguments[0] .GetProperties() .Where(o => o.Name == identifier + "1" || o.Name == identifier + "2"); if (links.Count() != 2) throw new Exception("La table d'association N-N n'a pas trouvé les 2 tables auxquelles elle doit être liée."); foreach (var item in links) builder.Property(item.Name + id) .HasColumnName(item.PropertyType.Name + id); // Code plus simple mais trop spécifique //builder.Property("Identifier1ID") // .HasColumnName("Object1ID"); //builder.Property("Identifier2ID") // .HasColumnName("Object2ID"); ////builder //// .HasOne("Identifier1") //// .WithMany() //// .HasForeignKey("Identifier1ID") //// .OnDelete(DeleteBehavior.Restrict); ////builder //// .HasOne("Identifier2") //// .WithMany() //// .HasForeignKey("Identifier2ID") //// .OnDelete(DeleteBehavior.Restrict); } } }
Et là, je ne sais pas quoi faire avec cette ligne... Et pourquoi cela fonctionne-t-il correctement avec MonProjetConsole et pas avec MonProjetInitialisation ?
Ensuite, j'ai eu la curiosité de supprimer complètement mon constructeur, pas de changement pour MonProjetConsole mais pour MonProejtInitialisation, voici mon message d'erreur (dans l'Exception et pas dans l'InnerException) :
Mais bon sang, ça fonctionne avec MonProjetConsole alors pourquoi cette autre erreur sur un autre objet (ce n'est pas le même lien) quand je suis dans MonProjetInitialisation ?System.InvalidOperationException*: 'Unable to determine the relationship represented by navigation property 'Object2.Object2Object2LinkChild' of type 'ICollection<Object2Object2Link>'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.'
Merci pour votre attention et sur cette heure tardive, je m'en vais me coucher (j'espère n'avoir rien oublié)...
Partager