2016-11-09 1 views
3

J'utilise Entity Framework 6 pour effectuer des opérations CRUD de base, ce qui est très bien. Je dois être en mesure de sélectionner mes objets dans une plage de dates, ce qui, encore une fois, est assez simple. Cependant, ces objets peuvent être répartis sur plusieurs bases de données qui sont essentiellement des entrepôts pour les données de l'année précédente. Une fois que nous les cherchons dans une plage de dates. Exemple: nous voulons tous les objets Foo entre le 1er janvier 2015 et le 9 novembre 2016; les données de Foo de 2015 seraient dans une base de données différente. Cela remonte à 2005. Tous les schémas ne sont pas identiques.Utilisation de Entity Framework avec des bases de données Archive

Nous pourrions avoir avoir 11 projets EF, ou 11 contextes et 11 chaînes de connexion. Cette solution a le problème d'avoir à ajouter du code chaque année lors de la création de l'archive. Cela semble être un hack. L'échange vers des méthodes de stockage Azure n'est pas une option dans un avenir prévisible.

Des solutions plus gracieuses?

Répondre

2

Tant que toutes vos bases de données ont les mêmes schémas (ou des schémas similaires) pour les entités que vous souhaitez interroger, vous pouvez avoir un seul DbContext pour toutes les bases de données et simplement changer la chaîne de connexion. Vous devrez gérer la liste des chaînes de connexion et les parcourir en boucle, en vous connectant à chacune d'entre elles et en interrogeant chacune d'elles pour les données. Bien sûr, si vos bases de données sont nommées de manière cohérente (par exemple en fonction de l'année), vous n'avez pas besoin de gérer toutes les chaînes de connexion. Si vos requêtes ne touchent qu'une seule base de données, vous pouvez calculer la chaîne de connexion appropriée et l'utiliser. Cela finira par ressembler à des stratégies de sharding standard. Here est une référence à la bibliothèque Azure SQL sharding de Microsoft pour EF qui peut aussi être une solution

Vous pouvez également être en mesure d'utiliser la base de données croisées de SQL Server interrogation capacités et mettre en place une vue sur toutes les bases de données. Cela a des problèmes de maintenance, sans parler des problèmes de performance, mais je ne connais pas la taille de vos données.

+0

Cela ressemble à un bon plan! Donc, nous regarderions une sorte d'expression rationnelle pour regarder la chaîne de connexion (probablement dans le web.config?) Et échanger. Les schémas pour les tableaux que je cherche sont similaires mais pas identiques. Est-ce que je ferais un remappage par fluence ou devrais-je juste me fier aux conventions d'EF pour faire la cartographie pour moi? (+1, mais je suis un <15 noob) – Jimbob

+0

@Jimbob Vous ne pouvez pas remapper EF au moment de l'exécution, donc créez plusieurs 'DbContext's ou créez vos entités afin qu'elles englobent tous les champs possibles dans tous vos DB, puis vérifiez les valeurs nulles sur les champs qui sont incompatibles. Vous feriez bien d'avoir une couche d'application en face de votre couche d'accès aux données pour fournir une vue cohérente des données. – flipchart

+0

Donc, nous examinerions un nouveau contexte chaque année? Je pense que l'un des administrateurs de base de données triera ce côté serveur avec un proc stocké auquel on peut passer des paramètres de date. Serait-ce mieux? – Jimbob