29 votes

Faire un Modèle d'Entity Framework s'étendent sur plusieurs bases de données

Est-il valable de faire quelque chose comme

CREATE SYNONYM [dbo].[MyTable] FOR [AnotherDatabase].dbo.[MyTable]

et ensuite modifier l'Entity Framework fichier edmx à lire cet objet comme il le ferait pour toute autre table?

J'ai fait un rapide test de l'échantillon et il semble bien fonctionner pour la sélection et la mise à jour, mais je voulais savoir si il y avait une raison pourquoi je ne devrais pas faire cela

Je suis la définition de la table par la création d'un fichier edmx pointant vers la 2ème base de données, la construction d'entités là, puis copier/coller de la définition de la 1ère base de données du fichier edmx.

Mise à JOUR

Si quelqu'un est intéressé, j'ai écrit jusqu'à ce que j'ai fait pour faire un fichier edmx durée de multiples bases de données ici. Il inclut des scripts pour générer des synonymes et de fusion edmx fichiers.

11voto

Ladislav Mrnka Points 218632

Si vous avez fait un test et cela a fonctionné, vous probablement montré quelque chose que personne d'autre ne sait. Jusqu'à maintenant j'ai toujours répondu à ce type de question: Il n'est pas possible d'utiliser un seul modèle avec deux bases de données (avec un peu plus laid solution fondée sur les opinions de cacher des tables à partir de la deuxième base de données). Maintenant, je sais que les deux solutions de contournement.

Le seul inconvénient de cette approche est que toutes les modifications apportées manuellement LSED partie de votre EDMX sont toujours perdues si vous exécutez le modèle de mise à Jour de la base de données. Cela signifie qu'il soit manuel de développement de l'EDMX (qui est un travail assez dur) ou en utilisant certains outil / script qui va ajouter vos modifications après chaque mise à jour de la base de données.

2voto

Brian Cauthon Points 4031

Vous pouvez également le faire avec des points de vue (et d'un serveur lié, si l'autre db est sur un autre serveur). Cela vous évitera d'avoir à gérer/fusion de deux edmx fichiers. J'ai utilisé cela avec un serveur lié pour la lecture de données à partir d'un deuxième db sur un autre serveur, mais a couru quelques tests pour voir si des mises à jour/insertions/suppressions sont possibles et qu'elles sont.

J'ai zéro expérience avec des transactions distribuées afin que l'information relative aux transactions distribuées peut être bon, mauvais, ou un peu des deux. Si vos deux db sont sur le même serveur que je ASSUMER les transactions distribuées ne s'appliquent plus.

Il ya un couple de choses à garder à l'esprit lors de l'utilisation d'un serveur lié.

  1. Lorsque vous modifiez les entités dans la db tables et appelez - SaveChanges sur votre contexte, ce sera d'essayer de démarrer une transaction distribuée de sorte que si quelqu'un sait comment faire pour arrêter cela, vous devez vous assurer que les deux serveurs sont configurés pour gérer les transactions distribuées. (Je suppose que cela serait vrai à l'aide de synonymes trop).
  2. Inserts sur les entités avec les colonnes d'identité sur le serveur lié lever une exception parce que ef essaie d'obtenir la nouvelle carte d'identité à l'aide de SCOPE_IDENTITY() et il est nul. Je ne sais pas si il y a un moyen de contourner cela. Je n'ai pas de problèmes de mise à jour ou la suppression d'entités sur le serveur lié avec les colonnes d'identité.

Sur SQL Server

  1. créer un serveur lié sur le serveur b (sauter cette étape si les db sont sur le même serveur).
  2. créer une vue en [ServerA].[MyDB] pour chaque table en [ServerB].[AnotherDB] vous souhaitez accéder

Dans EDMX

  1. Ajouter votre avis pour le fichier edmx
  2. Clairement l'entité paramètre de clé de chaque propriété dans le concepteur (y compris la réelle pk)
  3. Réinitialisation de l'entité clé pour le pk
  4. Ajouter les associations en tant que de besoin
  5. Enregistrer les modifications

Pour Les Mises À Jour/Insertions/Suppressions

  1. cliquez droit sur votre fichier edmx et l'ouvrir avec l'éditeur xml
  2. Accédez à l' StorageModel -> Schema -> EntityContainer
  3. Trouver l'entityset pour votre entité et de supprimer l' DefiningQuery élément
  4. Trouver l' store:Schema l'attribut de l'entité et de supprimer store: alors que c'est juste Schema. Quitter sa valeur à lui seul.
  5. Répétez les étapes 3 et 4 pour chaque point de vue à partir du serveur lié
  6. Enregistrer les modifications

Parce que l'utilisation d'un serveur lié crée une transaction distribuée que j'avais à faire à un couple de choses sur l' ObjectContext avant SaveChanges a été couronnée de succès.

ctx.Connection.Open();
ctx.ExecuteStoreCommand("set xact_abort on");
ctx.SaveChanges();
ctx.Connection.Close();

Vous pouvez probablement de créer un personnalisé, ObjectContext et remplacer SaveChanges ajouter ce genre de choses dans.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X