Entity Framework - Comment vérifier si la table existe?
j'utilise le Framework Entity avec Code First approach. La classe de base DbContext a des fonctions pour créer et supprimer la base de données ainsi que pour vérifier son existence.
je veux vérifier si une table spéciale (entité) ou pas. Est-ce possible avec une implémentation de framework ou dois-je écrire des méthodes personnalisées? Si je dois rédiger ma propre mise en œuvre, quelle serait l'approche la plus générique pour le faire?
merci de votre aide.
5 réponses
si vous avez besoin de vérifier l'existence de la table, vous devez appeler le code SQL personnalisé:
bool exists = context.Database
.SqlQuery<int?>(@"
SELECT 1 FROM sys.tables AS T
INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id
WHERE S.Name = 'SchemaName' AND T.Name = 'TableName'")
.SingleOrDefault() != null;
le nom de la Table est défini par défaut comme le nom de DbSet
exposé sur votre contexte dérivé mais le nom par défaut peut être modifié par ToTable
méthode ou Table
annotation des données.
faire cela de manière générique n'est pas quelque chose de supposé dans la première approche de code. Cela nécessitera la navigation des métadonnées et explorer manuellement à quelle table est l'entité mapped - cela peut être assez complexe parce que l'entité peut être mappée à plusieurs tables. Le Code first n'offre pas l'accès aux métadonnées. Vous devez convertir DbContext
ObjectContext
et parcourir MetadataWorkspace
.
Edit:
Pour convertir DbContext
ObjectContext
utilisation:
ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
je ne peux pas ajouter de commentaire pour le post précédent. J'utilise SQL Compact et je ne connais pas le schéma de la table. J'utilise ce code pour vérifier la table il est assez le même que dans le post précédent, mais il fonctionne pour n'importe quelle table.
/// <summary>
/// Check if data table is exist in application
/// </summary>
/// <typeparam name="T">Class of data table to check</typeparam>
/// <param name="db">DB Object</param>
public static bool CheckTableExists<T>(this ModelLocker db) where T : class
{
try
{
db.Set<T>().Count();
return true;
}
catch (Exception)
{
return false;
}
}
une méthode alternative; elle n'est pas aussi efficace que celle de Ladislav, mais elle n'est pas liée à SQL Server:
bool CheckTableExists()
{
try
{
context.YourTable.Count();
return true;
}
catch (Exception)
{
return false;
}
}
Assomption: SQL Server
attraper n'importe quelle vieille exception quand on interroge le DbSet
ne signifie pas que la table n'existe pas.
Interrogation d'un DbSet
où la table n'existe pas va jeter un EntityCommandExecutionException
avec une exception interne de type SqlException
. Cette exception intérieure a un ErrorNumber
propriété.
numéro d'Erreur 208 lit ( source):
nom de l'objet invalide'%.* ls'.
je pense que suivre le code est un peu plus compréhensible.
using(YourDbEntities db = new YourDbEntities())
{
bool IsExists = db.Database
.SqlQuery <int?> (@"
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = '" + yourTableName + "'
")
.FirstOrDefault() > 0;
return IsExists;
}