Entity Framework – Insertion d’une entité avec plusieurs modèles et bases de données

Mon domaine est divisé en plusieurs modèles Entity Framework. Certaines entités partagées couvrent plusieurs modèles (nommé Lookup). Cependant, elles sont remplacées par des références “à l’aide de” à l’aide des méthodes décrites dans Utilisation de grands modèles dans Entity Framework . Cependant, ce qui rend mon cas légèrement plus unique, c’est que je sépare également ces modèles en plusieurs bases de données (une par modèle).

Je ne parviens pas à insérer une de mes entités partagées dans ma firebase database commune. C’est échouer avec l’erreur:

Le membre d’identité ‘Harmony.Members.FK_ResidentialAddress_ResidenceTypeLookup’ n’existe pas dans la collection de métadonnées.

Cette clé étrangère à laquelle il fait référence n’existe pas dans la “firebase database commune”. Mais je ne travaille pas non plus avec l’entité de l’autre côté de la relation (nommée ResidentialAddress); Je n’ai même pas le contexte qui contiendrait l’autre entité initialisée (nommée MembersDb). Cependant, les deux modèles sont compilés dans le même assemblage.

Aucune propriété de navigation allant de Lookup à ResidentialAddress. Bien qu’il y ait une propriété de navigation dans l’autre sens (que je ne vais pas persister, j’utilise uniquement en mémoire).

Mon MetadataWorkspace pour l’ EntityConnection du contexte CommonDb a été explicitement initialisé avec uniquement le SSDL / CSDL / MSL pour les données requirejses pour cette firebase database. J’ai confirmé qu’il n’y avait aucune référence à la clé étrangère mentionnée dans cet dataset de schéma.

 var metaAssembly = typeof(CommonDb).Assembly; var schemaResources = new ssortingng[] { Ssortingng.Format("res://{0}/Common.ssdl", metaAssembly.FullName), Ssortingng.Format("res://{0}/Common.csdl", metaAssembly.FullName), Ssortingng.Format("res://{0}/Common.mdl", metaAssembly.FullName), } MetadataWorkspace metadata = new MetadataWorkspace(schemaResources, new []{ metaAssembly }); EntityConnection connection = new EntityConnection(metadata, myDatabaseConnection); 

CLUE POSSIBLE: Cela fonctionne lorsque je vais dans les classes générées et que je supprime tous les atsortingbuts EdmRelationshipAtsortingbute ainsi que leur paire EdmRelationshipNavigationPropertyAtsortingbute des modèles associés (MembersDb).

Questions clés:

  1. Alors, pourquoi Entity Framework essaie-t-il de faire quelque chose avec la relation qui est pour une entité qui n’est ni dans la scope, ni ne sera pas affectée par l’insertion de l’enregistrement!?

  2. Je suis heureux que le code généré supprime les atsortingbuts mentionnés ci-dessus, mais je souhaite tout de même conserver les propriétés de navigation. Comment pourrais-je modifier la CSDL pour atteindre cet objective?

REMARQUE: la persistance des modèles “enfants” n’est pas une priorité, pas plus que l’intégrité de leurs clés étrangères désormais inter-DB. Ces bases de données sont persistantes à l’aide de SQL CE, mais elles ont été générées à partir d’une firebase database maître SQL Server unique.

Si chaque partie de votre modèle est écrite dans une firebase database séparée, alors les fichiers edmx ne doivent peut-être pas se connaître l’un l’autre (à propos d’entités ou de relations avec des entités qui ne leur appartiennent pas).

Pourquoi ne pas essayer l’une des approches suivantes:
(Pour aboutir aux mêmes classes d’entités pour chaque partie, mais rendre EF inconscient des connexions entre elles.)

  1. Supprimez les “utilisations” d’edmx +, annulez la génération automatique et créez vous-même des classes.
  2. Supprimez les “utilisations” d’edmx + modifiez le modèle t4 pour lire plusieurs edmx lors de la création des classes.
  3. Copiez les fichiers edmx de façon à disposer de deux ensembles d’edmx.
    3.a. Utilisez le jeu n ° 1 pour la génération automatique d’entités.
    3.b. Modifiez le jeu n ° 2 en supprimant les “utilisations” et utilisez-le pour la génération de classes de référentiel (jeux d’objects).

Faites-moi savoir si l’un de ces travaux.

Bonne chance, Danny.