Question

À l'heure actuelle, je développe une application qui dépend (et relie ainsi) différentes bases de données via LINQ to SQL. Pour l'une des bases de données, la chaîne de connexion peut varier et est donc configurable - cependant, le schéma de cette base de données est identique pour toutes les chaînes de connexion.

En raison de la chaîne de connexion configurable, je veux valider le DataContext lors du démarrage de mon application, pour vous assurer que toutes les tables et les vues de mon application utilise, sont disponibles.

Les objets du Table<T> objet sont toujours DataContext initialisé - même si la table SQL correspondante ou vue n'a pas encore de dossiers.

Alors. À l'heure actuelle, la vérification de validation est réalisée comme suit:

        bool valid = _dataContext.Articles.Count() > 0
            && _dataContext.Customers.Count() > 0
            && _dataContext.Orders.Count() > 0;

Bien que cela fonctionne, la détermination de la valeur de validité prend un certain temps (chaque enregistrement de chaque tableau est touché), qui aboutit finalement à un temps. Alors, est-il un moyen plus rapide, plus fiable pour déterminer si oui ou non un d'un certain <=> existe vraiment comme <=> une table dans la base de données correspondante?

Était-ce utile?

La solution

Voici une idée (non testé):

Saisissez le nom de votre table. Vous pouvez coder en dur dans, ou vous pouvez le saisir programmation via

TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
                           .GetCustomAttributes(typeof(TableAttribute), true)
                           .Single();
string name = attribute.Name;

MyTableObject est le LINQ to SQL objet généré contenu dans votre Table, à savoir le paramètre générique T en Table<T>.

( TableAttribute est en System.Data.Linq.Mapping ).

Utilisez la DataContext.ExecuteQuery procédé selon la

var db = new MyDataContext();
var results = db.ExecuteQuery<string>("SELECT name FROM dbo.sysobjects WHERE xtype = 'U'");
bool hasTable = results.Any(s => "dbo." + s == name);    

Autres conseils

Un léger changement sur la réponse de Jason (je lui ai donné un upvote:))

public bool TableExistsInDatabase<T>()
{
  TableAttribute attribute = (TableAttribute)typeof(T)
                             .GetCustomAttributes(typeof(TableAttribute), true)
                             .Single();

  var result = ExecuteQuery<bool>(
                String.Format(
                  "IF OBJECT_ID('{0}', 'U') IS NOT NULL
                   SELECT CAST(1 AS BIT) ELSE 
                   SELECT CAST(0 AS BIT)", attribute.Name));

  return result.First();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top