2013-05-23 1 views
1

J'implémente un outil d'importation qui lit les données du fichier et les stocke dans une base de données. Nous avons une base de données en deux éditions différentes: une édition "complète" et une édition "légère". L'édition légère a une table de moins et quatre autres tables qui référencent la table manquante n'ont pas non plus cette colonne de clé étrangère.LINQ par rapport à un objet dynamique

J'ai déjà implémenté l'outil pour importer les données dans la base de données "complète" en utilisant Linq-to-Sql et je veux réutiliser la logique pour l'importation dans la version légère de la base de données.

Mon idée était d'utiliser dynamic objets à cette fin.

J'ai donc ajouté deux fichiers Linq-To-SQL .dbml différents à mon projet et les ai remplis avec la table respective. Je leur ai demandé d'utiliser différents espaces de noms pour éviter les conflits de noms.

Je n'ai aucun problème pour initialiser le DbContext (au moins je ne reçois pas d'erreur de compilation ici) de la variable dynamique:

  bool _usefirstdb; 
      dynamic _db; 
      if (_usefirstdb) 
      { 
       _db = new FirstDBDataContext (string.Format(SqlScripts.SqlServerConnectionString, args[1], args[2])); 
      } 
      else 
      { 
       _db = new SecondDBDataContext(string.Format(SqlScripts.SqlServerConnectionString,args[1], args[2])); 
      } 

mais je m'y suis des problèmes avec l'exécution de requêtes LINQ contre ce objets:

 var query = from inst in _db.Instances 
        where inst.Name.Equals(args[3]) 
        select inst.Id; 

en effet, le type de inst ne peut être déterminée par le compilateur (et n'est pas dynamic).

Y at-il un moyen de surmonter ce problème? Je sais que C# est de type statique, mais je ne vois pas d'autre moyen de réutiliser mon code ...

+1

interfaces d'utilisation. – SLaks

+0

L'utilisation de 'dynamic' est souvent le signe d'un mauvais code. Pas toujours, mais souvent. – Bobson

+0

@ SLaks: Je tombe sur un autre problème alors, voir la nouvelle question ici: http://stackoverflow.com/questions/16731814/linq-against-two-different-data-contexts-using-interfaces –

Répondre

1

Lorsque vos deux classes DbContext implémentent la même interface, vous pouvez avoir la référence comme interface. Dans votre interface, vous conservez le DbSet que possèdent vos deux contextes. Ensuite, lorsque vous utilisez linq, vous pouvez interroger uniquement ces ensembles et il est toujours de type sécurisé.

comme ceci:

public interface IInstances 
{ 
    DbSet<Instance> Instances { get; } 
} 

public FirstDBDataContext :DbContext, IInstances 
{ 
    //Normal implementation 
} 

public SecondDBDataContext :DbContext, IInstances 
{ 
    //Normal implementation 
} 

bool _usefirstdb; 
IInstances _db; 
if (_usefirstdb) 
{ 
    _db = new FirstDBDataContext (string.Format(SqlScripts.SqlServerConnectionString, args[1], args[2])); 
} 
else 
{ 
    _db = new SecondDBDataContext(string.Format(SqlScripts.SqlServerConnectionString,args[1], args[2])); 
} 

var query = from inst in _db.Instances 
    where inst.Name.Equals(args[3]) 
    select inst.Id; 
+0

Votre solution ne fonctionnerait pas , parce que je ne peux pas retourner 'DbSet ', je dois retourner une interface qui serait implémentée à la fois par 'InstanceOfFirstDbContext' et' InstanceOfSecondDbContext', voir ma nouvelle question ici: http://stackoverflow.com/questions/16731814/ linq-against-two-different-données-contextes-using-interfaces –

Questions connexes