moyen rapide pour détecter si une table DataContext ou la vue existe
-
21-08-2019 - |
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?
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();
}